• hdu 2588 GCD(欧拉函数)


    题目链接:hdu 2588 GCD

    题意:给定N,M(2<=N<=1000000000, 1<=M<=N), 求1<=X<=N 且gcd(X,N)>=M的个数。

    解法:先找出N的约数x,并且gcd(x,N)>= M,结果为所有N/x的欧拉函数之和。

        因为x是N的约数,所以gcd(x,N)=x >= M;

       设y=N/x,y的欧拉函数为小于y且与y互质的数的个数。

       设与y互质的的数为p1,p2,p3,…,p4

       那么gcd(x* pi,N)= x >= M。

              也就是说只要找出所有符合要求的y的欧拉函数之和就是答案了。

     1 #include<bits/stdc++.h>
     2 #define F(i,a,b) for(int i=a;i<=b;i++)
     3 using namespace std;
     4 
     5 int Eular(int n)
     6 {
     7     int ret = 1, i;
     8     for (i = 2; i*i <= n; i++)
     9     {
    10         if (n%i == 0)
    11         {
    12             n /= i, ret *= i - 1;
    13             while (n%i == 0)n/= i,ret *= i;
    14         }
    15     }
    16     if (n>1)ret *= n - 1;
    17     return ret;
    18 }
    19 
    20 int t,a,b;
    21 
    22 int main()
    23 {
    24     scanf("%d",&t);
    25     while(t--)
    26     {
    27         scanf("%d%d",&a,&b);
    28         int ans=0;
    29         for(int i=1;i*i<=a;++i)
    30             if(a%i==0)
    31             {
    32                 if(i>=b)ans+=Eular(a/i);
    33                 if(a/i!=i&&a/i>=b)ans+=Eular(i);
    34             }
    35             printf("%d
    ",ans);
    36     }
    37     return 0;
    38 }
    View Code
  • 相关阅读:
    微信小程序 模板语法-列表渲染
    Fast Matrix Calculation HDU
    AT4845 [ABC164E] Two Currencies
    [ABC127E] Cell Distance
    CF18E Flag 2
    CF10C Digital Root
    CF8C Looking for Order
    [ARC075B] Widespread
    旅行商问题
    AcWing 291. 蒙德里安的梦想
  • 原文地址:https://www.cnblogs.com/bin-gege/p/6203122.html
Copyright © 2020-2023  润新知