首页 > 其他 > 详细

hdu Co-prime

时间:2014-11-19 00:09:11      阅读:331      评论:0      收藏:0      [点我收藏+]

题意:求出在一个区间[A,B]内与N互质的个数 。

思路:

先求出n的质因子,然后求出与N的质因子不互质的个数然后总个数减去就是。用位运算二进制表示那个因子用到过,实现容斥原理。在1到n之间是c倍数的个数为n/c;

bubuko.com,布布扣
 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #define LL __int64
 5 using namespace std;
 6 
 7 int t;
 8 LL a,b,n;
 9 LL f[1000];
10 int cnt;
11 
12 void inti()
13 {
14     memset(f,0,sizeof(f));
15     cnt=0;
16     for(int i=2; i*i<=n; i++)
17     {
18         if(n%i==0)
19         {
20            f[cnt++]=i;
21            while(n%i==0)
22            {
23                n=n/i;
24            }
25         }
26     }
27     if(n>1)
28     {
29         f[cnt++]=n;
30     }
31 }
32 
33 LL Get_num(LL m)
34 {
35     LL ans=0;
36     for(int i=1; i<(1<<cnt); i++)
37     {
38         int xx=0;
39         LL x=1;
40         for(int j=0; j<cnt; j++)
41         {
42             if(i&(1<<j))
43             {
44                xx++;
45                x*=f[j];
46             }
47         }
48         if(xx%2!=0)
49         {
50             ans+=m/x;
51         }
52         else
53         {
54             ans-=m/x;
55         }
56     }
57     return m-ans;
58 }
59 
60 int main()
61 {
62     scanf("%d",&t);
63     for(int cas=1; cas<=t; cas++)
64     {
65         scanf("%I64d%I64d%I64d",&a,&b,&n);
66         inti();
67         printf("Case #%d: %I64d\n",cas,Get_num(b)-Get_num(a-1));
68     }
69     return 0;
70 }
View Code

 

hdu Co-prime

原文:http://www.cnblogs.com/fanminghui/p/4106638.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!