【BZOJ】【1101】【POI2007】Zap

莫比乌斯反演

  PoPoQQQ的讲义例一的一半……好吧这题是那题的基础部分= =很水……

WA了一次:因为没强制类型转换LL

 1 /**************************************************************
 2     Problem: 1101
 3     User: Tunix
 4     Language: C++
 5     Result: Accepted
 6     Time:6896 ms
 7     Memory:1908 kb
 8 ****************************************************************/
 9  
10 //BZOJ 1101
11 #include<cstdio>
12 #include<cstdlib>
13 #include<cstring>
14 #include<iostream>
15 #include<algorithm>
16 #define rep(i,n) for(int i=0;i<n;++i)
17 #define F(i,j,n) for(int i=j;i<=n;++i)
18 #define D(i,j,n) for(int i=j;i>=n;--i)
19 using namespace std;
20  
21 int getint(){
22     int v=0,sign=1; char ch=getchar();
23     while(ch<'0'||ch>'9') {if (ch=='-') sign=-1; ch=getchar();}
24     while(ch>='0'&&ch<='9') {v=v*10+ch-'0'; ch=getchar();}
25     return v*=sign;
26 }
27 /*******************tamplate********************/
28 const int N=50010;
29 typedef long long LL;
30 int prime[N],mu[N],sum[N];
31 bool check[N];
32 void getmu(){
33     mu[1]=1;
34     int tot=0;
35     for(int i=2;i<N;++i){
36         if (!check[i]){
37             prime[tot++]=i;
38             mu[i]=-1;
39         }
40         rep(j,tot){
41             if (i*prime[j]>N) break;
42             check[i*prime[j]]=1;
43             if (i%prime[j])
44                 mu[i*prime[j]]=-mu[i];
45             else{
46                 mu[i*prime[j]]=0;
47                 break;
48             }
49         }
50     }
51     F(i,1,N-1) sum[i]=sum[i-1]+mu[i];
52 }
53 LL calc(int m,int n,int k){
54     int i,last;
55     LL re=0;
56     n/=k; m/=k;
57     for(i=1;i<=m && i<=n;i=last+1){
58         last=min(n/(n/i),m/(m/i));
59         re+=(LL)(sum[last]-sum[i-1])*(m/i)*(n/i);
60     }
61     return re;
62 }
63 int main(){
64     int n=getint(),a,b,d;
65     getmu();
66     F(i,1,n){
67         a=getint(); b=getint(); d=getint();
68         printf("%lld\n",calc(a,b,d));
69     }
70     return 0;
71 }
View Code

 

1101: [POI2007]Zap

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 1559  Solved: 534
[Submit][Status][Discuss]

Description

FGD正在破解一段密码,他需要回答很多类似的问题:对于给定的整数a,b和d,有多少正整数对x,y,满足x<=a,y<=b,并且gcd(x,y)=d。作为FGD的同学,FGD希望得到你的帮助。

Input

第一行包含一个正整数n,表示一共有n组询问。(1<=n<= 50000)接下来n行,每行表示一个询问,每行三个正整数,分别为a,b,d。(1<=d<=a,b<=50000)

Output

对于每组询问,输出到输出文件zap.out一个正整数,表示满足条件的整数对数。

Sample Input

2
4 5 2
6 4 3

Sample Output

3
2

HINT

对于第一组询问,满足条件的整数对有(2,2),(2,4),(4,2)。对于第二组询问,满足条件的整数对有(6,3),(3,3)。

Source

[Submit][Status][Discuss]
posted @ 2015-02-16 17:28  Tunix  阅读(187)  评论(0编辑  收藏  举报