程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> HDU 2841 Visible Trees

HDU 2841 Visible Trees

編輯:C++入門知識

      題意:就是給定一個坐標(n,m),求(1,1)到(n,m)區間內x與y互質的坐標數。   思路:利用容斥從2到n,遍歷與m互質的個數。

 
#include <iostream>   
#include <cstdio>   
#include <cstdlib>   
#include <cmath>   
#include <cstring>   
#include <string>   
#include <vector>   
#include <list>   
#include <deque>   
#include <queue>   
#include <iterator>   
#include <stack>   
#include <map>   
#include <set>   
#include <algorithm>   
#include <cctype>   
#include <cfloat>   
using namespace std;  
  
typedef __int64 LL;  
const int N=1000005;  
const LL II=1000000007;  
const int INF=0x3f3f3f3f;  
const double PI=acos(-1.0);  
  
LL n,m,pri[N];  
  
LL prime(LL x)  
{  
    LL i,j,numi=0;  
    for(i=2;i*i<=x;i++)  
        if(x%i==0)  
        {  
            pri[numi++]=i;  
            while(x%i==0)  
                x/=i;  
        }  
    if(x>1)  
        pri[numi++]=x;  
    return numi;  
}  
  
LL dfs(LL k,LL n)  
{  
    LL i,j,t,numi;  
    numi=prime(k);  
    LL sum=0;  
    for(i=1;i<(1<<numi);i++)  
    {  
        LL temp=1,k=0;  
        for(j=0;j<numi;j++)  
            if(i&(1<<j))  
            {   temp*=pri[j];   k++;    }  
        if(k&1) sum+=n/temp;  
        else    sum-=n/temp;  
    }  
    return n-sum;  
}  
  
int main()  
{  
    LL i,j,T;  
    scanf("%I64d",&T);  
    while(T--)  
    {  
        scanf("%I64d%I64d",&n,&m);  
        LL sum=m;  
        for(i=2;i<=n;i++)  
        {  
            sum+=dfs(i,m);  
        }  
        printf("%I64d\n",sum);  
    }  
    return 0;  
}  

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <string>
#include <vector>
#include <list>
#include <deque>
#include <queue>
#include <iterator>
#include <stack>
#include <map>
#include <set>
#include <algorithm>
#include <cctype>
#include <cfloat>
using namespace std;

typedef __int64 LL;
const int N=1000005;
const LL II=1000000007;
const int INF=0x3f3f3f3f;
const double PI=acos(-1.0);

LL n,m,pri[N];

LL prime(LL x)
{
    LL i,j,numi=0;
    for(i=2;i*i<=x;i++)
        if(x%i==0)
        {
            pri[numi++]=i;
            while(x%i==0)
                x/=i;
        }
    if(x>1)
        pri[numi++]=x;
    return numi;
}

LL dfs(LL k,LL n)
{
    LL i,j,t,numi;
    numi=prime(k);
    LL sum=0;
    for(i=1;i<(1<<numi);i++)
    {
        LL temp=1,k=0;
        for(j=0;j<numi;j++)
            if(i&(1<<j))
            {   temp*=pri[j];   k++;    }
        if(k&1) sum+=n/temp;
        else    sum-=n/temp;
    }
    return n-sum;
}

int main()
{
    LL i,j,T;
    scanf("%I64d",&T);
    while(T--)
    {
        scanf("%I64d%I64d",&n,&m);
        LL sum=m;
        for(i=2;i<=n;i++)
        {
            sum+=dfs(i,m);
        }
        printf("%I64d\n",sum);
    }
    return 0;
}

 

      AC代碼:  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved