zoukankan      html  css  js  c++  java
  • [2020.12.07周一]赛氪A题

    赛氪

    题解:根据欧几里得辗转相除,很容易想到(gcd(i,n-i)=gcd(i,n))

    [egin{align*} &当n>1,f(n)=sum_{i=1}^{n-1}[gcd(i,n-i)==1]=sum_{i=1}^{n-1}[gcd(i,n)==1]+[gcd(n,n)==0]=sum_{i=1}^{n}[gcd(i,n)==1]=varphi (n)\ & herefore f(n)=varphi(n)\ &g(n)=sum_{d|n}f(frac{n}{d})=sum_{d|n}f(frac{n}{d})·1(d)=varphi*1=id,恒等函数\ & herefore g(n)=n\ &综上,这题只要作(k+1)/2次欧拉就好了;\ &但这个k依然很大,但没关系因为log次必然迭代到1,按照cy的说法是暴跳到1然后break;\ &复杂度O(nlog n)\ &下面来证明[思路by cy]:log次必然迭代到1(赛场上因为没证出来,不敢冲)\ &根据欧拉定理,n=p_1^{k_1}p_2^{k_2}cdots p_n^{k_n},varphi(n)=n·prod_{i=1}^{s} frac{p_i-1}{p_i}\ &varphi(奇数)=偶数\ &varphi(偶数)le偶数/2\ &varphi(n)le n-1\ &因此,varphi(varphi(n))le n/2 &p.s.这个证明不严谨,因为欧拉函数没有单调性,cy想了一个办法规避它,但我还没看懂 end{align*} ]

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int mod=1e9+7;
    long long  euler(long long  n)
    {
        long long res=n,a=n;
        for(long long i=2;i*i<=a;i++){
            if(a%i==0){
                res=res/i*(i-1);//先进行除法是为了防止中间数据的溢出
                while(a%i==0) a/=i;
            }
        }
        if(a>1) res=res/a*(a-1);
        return res;//返回euler(n)
    }
    int main()
    {
        int  T;ll n, k;
        scanf("%d",&T);
        while(T--)
        {
            scanf("%lld%lld",&n,&k);
            k=(k+1)/2;
            for(int i=1;i<=k;i++){
                n=euler(n);
                if(n==1) break;
            }
            printf("%lld
    ",n%mod);
        }
    }
    
  • 相关阅读:
    三毛
    深复制和浅复制
    并发和并行
    PhotoKit保存图片到相册
    利用代码块
    Maven打包程序
    通过Nginx+Tomcat简单实现发布时不间断服务的提供
    C# java MD5加密方不一致问题
    SpringBoot读取配置值的方式
    Java8之集合排序
  • 原文地址:https://www.cnblogs.com/zx0710/p/14109060.html
Copyright © 2011-2022 走看看