HDU 4135 Co-prime

来源:互联网 发布:淘宝上卖家送的跳蛋 编辑:程序博客网 时间:2024/06/05 05:39
#include <iostream>#include <cstdio>#include <string.h>using namespace std;long long prime[70];int m;long long ans(long long n){    long long  sum=0;    long long len=1<<m;    for(int i=1;i<len;i++)//神来之笔,就是和bfs一样的二进制的做法    原来1<<m是1左移动m位。    {        int k=0,count1=1;        for(long long j=0;j<m;j++)        {            if(i&(long long) (1<<j)){                    count1*=prime[j];                  k++;            }        }        if(k%2==1)sum+=n/count1;        else sum-=n/count1;    }    return n-sum;}int main(){    int t;   // printf("%d",1<<3);    cin>>t;    for(int j=1;j<=t;j++)    {        long long a,b,n;        cin>>a>>b>>n;        m=0;        memset(prime,0,sizeof(prime));        for(long long i=2;i*i<n;i++)        {            if(n&&n%i==0){prime[m++]=i;            while(n&&n%i==0)n/=i;}        }        if(n>1)prime[m++]=n;      cout<<"Case #"<<j<<": "<<ans(b)-ans(a-1)<<endl;    }        return 0;}

0 0