• 欧拉函数(例题)


    φ//如果不熟悉欧拉函数可转超链接<--

    正题:

    1.仪仗队

    求从(0,0)点可以看到的点,我们考虑正比例函数的斜率,同一斜率上只能看到一个点,我们要知道对于斜率0~1在一个n*n的点阵中有多少可能的斜率使得有若干点在函数上。

    观察规律:

    1*1:显然答案为0(自己看到自己当然不算了)

    2*2:有斜率0,1/2(当然0是重的,一下重复的就不再考虑了),所以多了一种,答案为1

    3*3:多了1/3,2/3,答案为3

    4*4:多了1/4,2/4,3/4;2/4重了,所以答案为5

    5*5:多了1/5,2/5,3/5,4/5,答案为9

    ......

    n*n:多了1/n,2/n,3/n,4/n,......,(n-1)/n中不重复的,不重复就是说分数要最简。

    那就成了求1~n中所有数i中1~i-1中与i互质的数的个数只和,即为欧拉函数。

    求出和来之后最终答案应该为2*ans+1(我们算过了y=x的下半边三角形的情况,还有上半边呢?)

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    bool b[100010];
    int n,prime[100010],total,phi[100010],ans;
    int main()
    {
        scanf("%d",&n);
        b[0]=b[1]=1;
        phi[1]=1;
        for(int i=2;i<=n;i++)
        {
            if(!b[i])
            {
                prime[++total]=i;
                phi[i]=i-1;
            }
            for(int j=1;j<=total;j++)
            {
                if(i*prime[j]>n)break;
                b[i*prime[j]]=1;
                if(i%prime[j]==0)
                {
                    phi[i*prime[j]]=phi[i]*prime[j];
                    break;
                }
                else
                phi[i*prime[j]]=phi[i]*(prime[j]-1);
            }
        }
        for(int i=1;i<=n-1;i++)ans+=phi[i];
        printf("%d",ans*2+1);
    }
    

      

    2.Farey Sequence:

    题目描述:对于任意整数n>1,存在分数集合序列F,Fi=a/b,其中0<a<b≤n,且(a,b)=1.给定T个正整数n,求Fn的项数。

    解:

    我们看这个集合的实质,集合不能有重复元素,所以分数必须是最简,那就是说对b∈[1,n],a∈[1,b-1]中满足(a,b)互质的对数。

    即求φ(1)+φ(2)+φ(3)+...+φ(n),由于数据有多组,我们考虑预处理,用前缀和记录对任意n的答案。

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    bool b[100010];
    int n,prime[100010],total,phi[100010],ans[100010];
    int main()
    {
    	
        n=100000;
        b[0]=b[1]=1;
        phi[1]=1;
        for(int i=2;i<=n;i++)
        {
            if(!b[i])
            {
                prime[++total]=i;
                phi[i]=i-1;
            }
            for(int j=1;j<=total;j++)
            {
                if(i*prime[j]>n)break;
                b[i*prime[j]]=1;
                if(i%prime[j]==0)
                {
                    phi[i*prime[j]]=phi[i]*prime[j];
                    break;
                }
                else
                phi[i*prime[j]]=phi[i]*(prime[j]-1);
            }
        }
        for(int i=2;i<=n;i++)
        ans[i]=ans[i-1]+phi[i];
        int t;
        scanf("%d",&t);
        for(int i=1;i<=t;i++)
        {
        	scanf("%d",&n);
        	printf("%d\n",ans[n]);
    	}
    }
    

      

  • 相关阅读:
    win7下命令行添加系统服务
    java执行cmd命令
    grails-BuildConfig.groovy中grails.war.resources
    密码学
    Grails框架优劣势
    groovy+idea+Maven项目加载自身jar包
    cmd查看我的电脑盘符和文件
    MySQL insert插入
    MySQL截取字符串函数方法
    mysql 替换语句
  • 原文地址:https://www.cnblogs.com/zzh666/p/8835162.html
Copyright © 2020-2023  润新知