2 1 3 1 5 1 1 11014 1 14409 9
Case 1: 9 Case 2: 736427HintFor the first sample input, all the 9 pairs of numbers are (1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (2, 3), (2, 5), (3, 4), (3, 5).莫比乌斯反演资料:
http://wenku.baidu.com/view/542961fdba0d4a7302763ad5.html
http://baike.baidu.com/link?url=1qQ-hkgOwDJAH4xyRcEQVoOTmHbiRCyZZ-hEJxRBQO8G0OurXNr6Rh6pYj9fhySI0MY2RKpcaSPV9X75mQv0hK
#include<iostream> #include<cstring> #include<cstdlib> #include<cstdio> #include<cmath> #include<set> #include <queue> #include<algorithm> const double PI = acos(-1.0); using namespace std; int mu[100005], vis[100005], prime[100005]; void Mobuls() { memset(vis, 0 ,sizeof(vis)); mu[1] = 1; int top = 0; for(int i = 2; i <= 100000; ++ i) { if(!vis[i]) { prime[top ++ ] = i; mu[i] = -1; } for(int j = 0; j < top; ++ j) { if(i * prime[j] > 100000) break; vis[i * prime[j]] = 1; if(i % prime[j] == 0) { mu[i * prime[j]] = 0; break; } else mu[i * prime[j]] = -mu[i]; } } } int main() { int n, a, b, c, d, k, i, j; int t = 1; scanf("%d", &n); Mobuls(); while(n --) { scanf("%d%d%d%d%d", &a, &b, &c, &d, &k); if(k == 0) { printf("Case %d: 0\n", t ++); continue; } b /= k; d /= k; long long ans1 = 0, ans2 = 0; for(i = 1; i <= max(b, d); ++ i) ans1 += (long long) mu[i] * (b / i) * (d / i); for(i = 1; i <= min(b, d); ++ i) ans2 += (long long) mu[i] * (min(b, d) / i) * (min(b, d) / i); printf("Case %d: %lld\n",t ++, ans1 - ans2 / 2); } }