zoukankan      html  css  js  c++  java
  • POJ 2773 Happy 2006【GCD/欧拉函数】

    根据欧几里德算法,gcd(a,b)=gcd(a+b*t,b)

    如果a和b互质,则a+b*t和b也互质,即与a互质的数对a取模具有周期性。

    所以只要求出小于n且与n互质的元素即可。

    #include<stdio.h>
    #include<string.h>
    const int N=1000100;
    int pr[N],cnt; 
    int gcd(int a,int b){
        if(!b)    return a;
        return gcd(b,a%b);
    }
    int main(){
        int n,k;
        while(~scanf("%d%d",&n,&k)){
            cnt=0;
            for(int i=1;i<=n;i++){
                if(gcd(n,i)==1)
                    pr[++cnt]=i;
            }
            if(k%cnt)
                printf("%d
    ",k/cnt*n+pr[k%cnt]);
            else
                printf("%d
    ",(k/cnt-1)*n+pr[cnt]);
        }
        return 0;
    }

    也可以用欧拉函数求小于n且与n互质的元素。就不用O(N)了。速度提高10倍左右。

  • 相关阅读:
    function函数
    for的衍生对象
    前端发展史
    字符串替换
    正则
    DOM和BOM的区别与联系
    BOM
    DOM
    css单位分析
    API and Web API
  • 原文地址:https://www.cnblogs.com/L-King/p/5718784.html
Copyright © 2011-2022 走看看