萌新求助, 开O2会WA

P2257 YY的GCD

```cpp #include <cstdio> #include <cstring> #include <cctype> #define RE register namespace wmd { const int MAXN = 50050; inline int min(const int & a, const int & b) {return a < b ? a : b;} inline char gc() { static char now[1 << 20], * S, * T; if(S == T) {T = (S = now) + fread(now, 1, 1 << 20, stdin); if(S == T) return EOF;} return *S++; } inline int read() { RE int x = 0; RE char ch = gc(); while(!isdigit(ch)) ch = gc(); while(isdigit(ch)) x = (x + (x << 2) << 1) + (ch ^ 48), ch = gc(); return x; } int n, mu[MAXN], vis[MAXN], prime[MAXN], cnt; inline void prework() { mu[1] = vis[1] = 1; for(RE int i = 2; i < MAXN; ++i) { if(!vis[i]) {vis[i] = i; prime[++cnt] = i; mu[i] = -1;} for(RE int j = 1; j <= cnt; ++j) { if(prime[j] > vis[i] || prime[j] > MAXN / i) break; vis[i * prime[j]] = prime[j]; if(i % prime[j]) mu[i * prime[j]] = -mu[i]; else mu[i * prime[j]] = 0; } } for(RE int i = 1; i < MAXN; ++i) mu[i] += mu[i - 1]; } inline void main() { n = read(); prework(); for(RE int i = 1; i <= n; ++i) { RE int a = read(), b = read(), d = read(); RE int lim = min(a / d, b / d), ans = 0; a /= d, b /= d; for(RE int l = 1, r; l <= lim; l = r + 1) { RE int r1 = a / l, r2 = b / l; r = min(lim, min(a / r1, b / r2)); ans += (mu[r] - mu[l - 1]) * r1 * r2; } printf("%d\n", ans); } } } int main() { // freopen("data.in", "r", stdin); wmd :: main(); return 0; } ```
by _WMD @ 2019-03-06 16:36:03


一般这种情况就是数组越界之类的问题。
by EMT__Mashiro @ 2019-03-06 16:38:56


@[_WMD](/space/show?uid=84645) **可能是你写的太优秀了,洛谷评测机给你卡掉了QAQ**
by 初嫁QAQ @ 2019-03-06 17:05:33


|