```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