zoukankan      html  css  js  c++  java
  • 欧拉函数

    学习资料:https://blog.csdn.net/sentimental_dog/article/details/52002608

    注意最后一行需要让res/a*(a-1)

    因为a本身是可以模a的,但i*i<=a,所以没有枚举到a本身

    int euler(int n)
    {
        int res=n,a=n;
        for(int 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;
    }
    

      

    例题一:http://codeforces.com/gym/101778/problem/C

    解:    直接套用欧拉函数即可

    例题二:http://acm.hdu.edu.cn/showproblem.php?pid=2588

     解: 将x与n转化为,x=a*b,n=a*d(b和d互质,并且d大于等于b)对于每个大于等于m的a  ,这样的b有euler(d)个。

    #include <bits/stdc++.h>
    using namespace std;
    int euler(int n)
    {
        int res=n,a=n;
        for(int 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;
    }
    int main()
    {
        int t,n,m;
        cin>>t;
        for(int i=1;i<=t;i++)
        {
             int ans=0;
             scanf("%d %d",&n,&m);
             for(int j=1;j*j<=n;j++)
             {
                 if(n%j==0)
                 {
                     if(j>=m)ans+=euler(n/j);
                     if(n/j>=m&&j*j!=n)ans+=euler(j);
                 }
             }
             printf("%d
    ",ans);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    tty & pty & pts
    PageRank
    How to run a terminal inside of vim?
    vimdiff
    svn's tree conflict
    svn's diff command
    符号表分离
    gcc -D
    Options for Debugging Your Program or GCC
    invoking gdb
  • 原文地址:https://www.cnblogs.com/carcar/p/8926107.html
Copyright © 2011-2022 走看看