zoukankan      html  css  js  c++  java
  • hdu2588 GCD

    GCD

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 3559    Accepted Submission(s): 1921


    Problem Description
    The greatest common divisor GCD(a,b) of two positive integers a and b,sometimes written (a,b),is the largest divisor common to a and b,For example,(1,2)=1,(12,18)=6.
    (a,b) can be easily found by the Euclidean algorithm. Now Carp is considering a little more difficult problem:
    Given integers N and M, how many integer X satisfies 1<=X<=N and (X,N)>=M.
     
    Input
    The first line of input is an integer T(T<=100) representing the number of test cases. The following T lines each contains two numbers N and M (2<=N<=1000000000, 1<=M<=N), representing a test case.
     
    Output
    For each test case,output the answer on a single line.
     
    Sample Input
    3
    1 1
    10 2
    10000 72
     
    Sample Output
    1
    6
    260
     题意:输入测试样例数 t,输入n ,m。判断满足gcd(x,n)>=m条件x的个数
    因为gcd(x,n)>=m
    所以可以推出gcd(x/m,n/m)==1
     
    所以题目转化为满足gcd(x/m,n/m)==1中X的个数 <==> 求 不大于n/m且与其互质的 n/m的个数 即求ϕ(n/m)

    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    typedef long long ll;
    
    ll euler(ll x)
    {
        ll res = x;
        for(int i=2 ;i*i<=x ;i++)
        {
            if(x%i == 0)
            {
                res = res/i*(i-1);
                while(x%i==0) 
                  x/=i;
            }
        }
        if(x>1) 
          res = res/x*(x-1);
        return res;
    }
    
    int main(){
        int T;
        scanf("%d",&T);
        while(T--)
        {
            ll n,m;
            scanf("%I64d%I64d",&n,&m);
            ll ans = 0;
            for(ll i=1 ;i*i<=n ;i++)
            {
                if(n%i == 0)//i是n的因数
                {
                    if(i >= m)
                    {
                        ans += euler(n/i);
                    }
                    if((n/i)>=m && n/i != i)//i*(n/i)==n,判断i对应的另一个因数是否符合
                    {
                        ans += euler(i);
                    }
                }
            }
            printf("%I64d
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    排序算法与数据结构复习总结
    Kafka知识总结及面试题
    深入理解Redis系列之事务
    深入理解Redis系列之持久化
    基于数据库、redis和zookeeper实现的分布式锁
    深入理解MySQL系列之优化
    Mysql-主从复制(Docker)
    Mysql-GTID主从复制
    Ansible基础
    Nginx + php-fpm源码编译
  • 原文地址:https://www.cnblogs.com/-citywall123/p/10170516.html
Copyright © 2011-2022 走看看