QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#404996#3004. It's a Mod, Mod, Mod, Mod WorldLspeed#WA 2293ms3700kbC++202.9kb2024-05-05 05:57:382024-05-05 05:57:39

Judging History

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

  • [2024-05-05 05:57:39]
  • 评测
  • 测评结果:WA
  • 用时:2293ms
  • 内存:3700kb
  • [2024-05-05 05:57: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;

#define i64 int
//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;

	long long 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 ;
	}
**/
	int B = 3000;
	vector<int> bucket(B);
	long long ans = 0;
	i64 cur = 0;
	long long 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;
	long long 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: 0
Wrong Answer
time: 2293ms
memory: 3700kb

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
1522158717394
1522158717394
1522159717350
1522160717305
1522161717259
1522162717212
1522163717164
1522164717115
1522165717065
1522166717014
1522167716962
1522168716909
1522169716855
1522170716800
1522171716744
...

result:

wrong answer 46th lines differ - expected: '499956500946', found: '1522158717394'