QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#404992#3004. It's a Mod, Mod, Mod, Mod WorldLspeed#TL 1459ms3848kbC++202.9kb2024-05-05 05:51:382024-05-05 05:51:39

Judging History

你现在查看的是最新测评结果

  • [2024-05-05 05:51:39]
  • 评测
  • 测评结果:TL
  • 用时:1459ms
  • 内存:3848kb
  • [2024-05-05 05:51:38]
  • 提交

answer

#include<bits/stdc++.h>
#pragma GCC optimize("O3")
#define x first
#define y second
#define eb emplace_back
#define pb push_back
#define FOR(i,a,b) for(int i=(a);i<=(b);++i)
#define ROF(i,a,b) for(int i=(a);i>=(b);--i)
#define all(x) (x).begin(),(x).end()
#define mp make_pair
#define sz(x) (int)(x).size()
#define make_unique(x) sort(all(x)), (x).erase(unique(all(x)), (x).end())

using namespace std;

typedef long long i64;
//typedef __int128 i128;
typedef long double ld;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<i64> vl;
typedef vector<vl> vvl;
typedef pair<int,int> pii;
typedef pair<i64,i64> pll;
typedef tuple<int,int,int> iii;
typedef vector<pii> vpii;
typedef vector<pll> vpll;

int readInt() { int a; scanf("%d",&a); return a; }
i64 readLong() { i64 a; scanf("%lld",&a); return a; }
char readChar() { char a; scanf(" %c",&a); return a; }
double readDouble() { double a; scanf(" %lf",&a); return a; }
void readString(char *s) { scanf(" %s",s); }

const int mod = 998244353;
int add(int a, int b) { return ((a+=b)>=mod) ? a-mod:a; }
int mul(int a, int b) { return a*1ll*b%mod; }
int pw(int a, int b) {
	int ans = 1, res = a;
	for(int i = 1; i <= b; i*=2, res=mul(res,res)) {
		if(i&b) {
			ans = mul(ans, res);
		}
	}
	return ans;
}

void solve() {
	int p = readInt();
	int q = readInt();
	int n = readInt();

	p%= q;

	i64 A = p*1ll*n*(n+1)/2;

	/**if(q <= 1000) {
		i64 sum = 0;
		i64 cur = 0;
		i64 m = 0;
		FOR(i,1,q) {
			cur += p;
			if(cur >= q) {
				m += 1;
				cur -= q;
			}
			sum += m;
		}

		i64 k = n/q;
		i64 ans = k*sum + m*q*k*(k-1)/2;
		m *= k;

		n %= q;
		assert(cur == 0);

		FOR(i, 1, n) {
			cur += p;
			if(cur >= q) {
				m += 1;
				cur -= q;
			}
			ans += m;
		}
		printf("%lld\n",A-q*ans);
		return ;
	}

	if(n <= 1000) {
		i64 sum = 0;
		i64 cur = 0;
		i64 m = 0;
		FOR(i,1,n) {
			cur += p;
			if(cur >= q) {
				m += 1;
				cur -= q;
			}
			sum += m;
		}
		printf("%lld\n",A-q*sum);
		return ;
	}
**/
	const int B = 1200;
	vector<int> bucket(B);
	i64 ans = 0;
	i64 cur = 0;
	i64 sum = 0;
	FOR(i,1,B) {
		cur += p;
		if(cur >= q) {
			cur -= q;
		}
		bucket[i-1] = cur;
		sum += cur;
		//ans += m;
	}
	sort(all(bucket));

	//peek the first few
	
	// loop
	i64 save_cur = cur;
	i64 save_sum = sum;
	// reset cur and m
	cur = 0;
	int i = 0;
	while(n >= B) {
		// cur, m
		// ans
		
		// binary search to update m and ans
		//int idx = upper_bound(all(bucket), pii(cur,1<<30))-bucket.begin()-1;
		int idx = lower_bound(all(bucket), q-cur)-bucket.begin();

		ans += cur*B + save_sum - (B-idx)*q;
		cur += save_cur;
		if(cur >= q) {
			cur -= q;
		}

		n -= B;
		i += B;
	}

	FOR(i,1,n) {
		cur += p;
		if(cur >= q) {
			cur -= q;
		}
		ans += cur;
	}
	printf("%lld\n",ans);
}

int main() {

	int q = readInt();
	while(q--) {
		solve();
	}
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 1459ms
memory: 3848kb

input:

91125
999956 999956 999956
999956 999956 999957
999956 999956 999958
999956 999956 999959
999956 999956 999960
999956 999956 999961
999956 999956 999962
999956 999956 999963
999956 999956 999964
999956 999956 999965
999956 999956 999966
999956 999956 999967
999956 999956 999968
999956 999956 999969
...

output:

0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
499956500946
499956500946
499957500902
499958500857
499959500811
499960500764
499961500716
499962500667
499963500617
499964500566
499965500514
499966500461
499967500407
499968500352
499969500296
499970500239
49...

result:

ok 91125 lines

Test #2:

score: 0
Accepted
time: 92ms
memory: 3732kb

input:

8000
1 1 1
1 1 2
1 1 3
1 1 4
1 1 5
1 1 6
1 1 7
1 1 8
1 1 9
1 1 10
1 1 999991
1 1 999992
1 1 999993
1 1 999994
1 1 999995
1 1 999996
1 1 999997
1 1 999998
1 1 999999
1 1 1000000
1 2 1
1 2 2
1 2 3
1 2 4
1 2 5
1 2 6
1 2 7
1 2 8
1 2 9
1 2 10
1 2 999991
1 2 999992
1 2 999993
1 2 999994
1 2 999995
1 2 999...

output:

0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
1
2
2
3
3
4
4
5
5
499996
499996
499997
499997
499998
499998
499999
499999
500000
500000
1
3
3
4
6
6
7
9
9
10
999991
999993
999993
999994
999996
999996
999997
999999
999999
1000000
1
3
6
6
7
9
12
12
13
15
1499988
1499988
1499989
1499991
1499994
1499994
149999...

result:

ok 8000 lines

Test #3:

score: -100
Time Limit Exceeded

input:

100000
848401 999985 1000000
999527 999616 1000000
999789 999914 1000000
999479 999722 1000000
999841 999933 1000000
406226 999991 1000000
940598 999982 1000000
999708 999994 1000000
948123 999993 1000000
999789 999851 1000000
999522 999893 1000000
999977 999983 1000000
999912 999924 1000000
999232 ...

output:

499992309650
499992847584
499999028720
499990037714
499999288213
499994780341
499990845156
499998993982
499997047626
499998796124
499997350691
499999498946
499993962456
499999037615
499998396930
499994213619
499996210819
499998734816
499998193499
499997294296
499997311600
499997563064
499998257020
4...

result: