http://acm.hdu.edu.cn/showproblem.php?pid=4135
交了十几次,。最后发现理解错题意了,区间包含右端点,一直按不包含做的。。
求出N的质因数 根据容斥原理解出区间数能被质因数整除的 再减掉
View Code
1 #include <iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstring> 5 using namespace std; 6 #define LL __int64 7 LL sum1,sum2,a,b,n; 8 int g,x[1001]; 9 void dfs(int i,LL y,int num) 10 { 11 int j; 12 if(y!=x[i]) 13 y = y*x[i]; 14 if(num%2!=0) 15 { 16 sum1+=(a-1)/y; 17 sum2+=b/y; 18 } 19 else 20 { 21 sum2-=b/y; 22 sum1-=(a-1)/y; 23 } 24 for(j = i+1 ; j <= g ; j++) 25 dfs(j,y,num+1); 26 } 27 int main() 28 { 29 int t,i,j,k = 0; 30 cin>>t; 31 while(t--) 32 { 33 k++; 34 scanf("%I64d%I64d%I64d",&a,&b,&n); 35 sum1 = 0; 36 sum2 = 0; 37 g = 0; 38 x[g] = 0; 39 LL yy = n; 40 for(i = 2 ; i <= sqrt(yy*1.0) ; i++) 41 { 42 if(n%i==0) 43 { 44 g++; 45 x[g] = i; 46 while(n%i==0) 47 n = n/i; 48 } 49 } 50 if(n!=1) 51 { 52 g++; 53 x[g] =n; 54 } 55 for(i = 1; i <= g ; i++) 56 dfs(i,x[i],1); 57 printf("Case #%d: ",k); 58 LL sum = b-sum2-(a-1-sum1); 59 printf("%I64d\n",sum); 60 } 61 return 0; 62 }