• POJ3090 巧用欧拉函数 phi(x)


    POJ3090 给定一个坐标系范围 求不同的整数方向个数 

    分析: 除了三个特殊方向(y轴方向 x轴方向 (1,1)方向)其他方向的最小向量表示(x,y)必然互质

    所以对欧拉函数前N项求和 乘2(关于(1,1)对称)再+3就是答案

    给出代码

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<cmath>
    using namespace std;
    typedef long long int LL;
    LL getPrime(bool notprime[],LL prime[],LL N)
    {
     LL tot=0;
     for(LL i=2;i<=N;i++)
       {
        if(!notprime[i]) prime[tot++]=i;
        for(LL j=0;j<tot;j++)
           {
            if(prime[j]*i>N)break;
            notprime[prime[j]*i]=true;
            if(i%prime[j]==0)break;
    	   }
       }
     return tot;
    }
    LL pow_mod(LL n,LL k,LL p)
    {
     if(k==0)return 1;
     LL w=1;
     if(k&1)w=n%p;
     LL ans=pow_mod(n*n%p,k>>1,p);
     return ans*w%p;
    }
    bool Miller_Rabin(LL n,LL a,LL d)
    {
     if(n==2)return true;
     if(n==a)return true;
     if(n%a==0)return false;
     if((n&1)==0)return false;
     while(!(d&1))d=d>>1;
     LL t=pow_mod(a,d,n);
     if(t==1)return true;//特别注意!! 
     while((d!=n-1)&&(t!=1)&&(t!=n-1))
     		{
     		 t=(LL)t*t%n;
    		 d=d<<1; 
    		 
    		}
    
     return (t==n-1||(d&1)==1);
    }
    bool isPrime(LL n,LL times)                           
    {
     if(n<2)return false;
     LL a[4]={2,3,5,7};
     for(LL i=0;i<4;i++){if(!Miller_Rabin(n,a[i],n-1))return false;}
     return true;
    }
    void Factor(LL n,LL a[],LL b[],LL &tot)
    {
     LL temp,i,now;
     temp=(LL)((double)sqrt(n)+1);
     tot=0;
     now=n;
     for(i=2;i<=temp;i++)
     	if(now%i==0)
    	 	{
    	 	 a[tot]=i;
    	 	 b[tot]=0;
    	 	 while(now%i==0)
    	 	 	{
    	 	 	 b[tot]++;
    	 	 	 now/=i;
    			}
    		 tot++;
    		}	
    	if(now!=1)
    		{
    		 a[tot]=now;
    		 b[tot++]=1;
    		}
    } 
    LL digitsum(LL n)
    {
     LL ans=0;
     for(LL i=0;;i++)
     	{
     	 LL div=pow(10,i);
     	 if((n/div)==0)return ans;
     	 ans+=(n%(div*10))/div;
    	}
    }
    void getPhi(LL mindiv[],LL phi[],LL max)
    {
     max=max+1;
     for(LL i=1;i<max;i++)
        mindiv[i]=i;
     for(LL i=2;i<(LL)(sqrt(max)+1);i++)
     	{
     	 if(mindiv[i]==i)
     	 	{
     	 	 for(LL j=i*i;j<max;j+=i)
     	 	    mindiv[j]=i;
    		}
    	}
     memset(phi,0,sizeof(phi));
     phi[1]=1;
     for(LL i=2;i<max;++i)
     	{
     	 phi[i]=phi[i/mindiv[i]];
     	 if(((i/mindiv[i])%mindiv[i])==0)phi[i]*=mindiv[i];
     	 	else phi[i]*=mindiv[i]-1;
    	}
    }
    void getMobius(LL mu[],LL max)
    {
     for(LL i=1;i<=max;i++)
     	{
     	 LL target=i==1?1:0;
     	 LL delta=target-mu[i];
     	 mu[i]=delta;
     	 for(LL j=i+i;j<=max;j+=i)
     	    mu[j]+=delta;
    	}
    }
    LL mindiv[1001],phi[1001];
    int main()
    {
     //freopen("t.txt","r",stdin);
     //freopen("1.txt","w",stdout);
     getPhi(mindiv,phi,1000);
     LL sum[1001];
     sum[1]=0;
     sum[2]=1;
     for(int i=3;i<=1000;i++)
        sum[i]=sum[i-1]+phi[i];
     int np;
     scanf("%d",&np);
     for(int i=1;i<=np;i++)
     	{
     	 int now;
     	 scanf("%d",&now);
     	 LL ans=sum[now]*2+3;
     	 printf("%d %d %lld
    ",i,now,ans);
    	}
     return 0;
    }
    

      

  • 相关阅读:
    Handler一般处理程序的应用--随机图片生成
    一个内外网部署sharepoint的配置
    不使用SQL Server Management Studio备份数据库的方法
    根据模板生成网页
    一个简单的将Oracle生产库定期备份到备份库的方法
    c#序列化与反序列化
    The Java Reliable Multicast Service:A Reliable Multicast Library
    Video capture using JMF
    转:关于Jxta的Advertisement
    Practical JXTA II
  • 原文地址:https://www.cnblogs.com/heisenberg-/p/6572594.html
Copyright © 2020-2023  润新知