码迷,mamicode.com
首页 > 其他好文 > 详细

hdu Co-prime

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

标签:style   blog   http   io   ar   color   os   sp   for   

题意:求出在一个区间[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

标签:style   blog   http   io   ar   color   os   sp   for   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!