zoukankan      html  css  js  c++  java
  • nyoj1007——欧拉求和

    GCD

    时间限制:1000 ms  |  内存限制:65535 KB
    难度:3
     
    描述
    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,please answer sum of  X satisfies 1<=X<=N and (X,N)>=M.
     
    输入
    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 (1<=N<=10^9, 1<=M<=10^9), representing a test case.
    输出
    Output the answer mod 1000000007
    样例输入
    3
    1 1
    10 2
    10000 72
    样例输出
    1
    35
    1305000
    上传者
    ACM_张书军
    #include <bits/stdc++.h>
    using namespace std;
    typedef long long  ll;
    const int INF = 0x3f3f3f3f;
    const int maxn = 2000;
    const int moder = 1000000007;
    
    ll eular(ll n)
    {
        ll ans = n;
        for(int i=2;i*i <= n;i++){
            if(n%i == 0){
                ans = ans - ans/i;
                while(n%i == 0)
                    n = n/i;
            }
        }
        if(n > 1)
            ans = ans - ans/n;
        return ans;
    }
    
    ll eular_sum(ll k)
    {
        if(k==1||k==2)
            return 1;
        else return k*eular(k)/2;
    }
    
    int main()
    {
        int t;
        scanf("%d",&t);
        while(t--){
            ll n,m;
            scanf("%lld%lld",&n,&m);
            ll res = 0;
            for(int i=1;i*i <= n;i++) {
                if (n % i == 0) {
                    if (i >= m) {
                        res = (res + i * eular_sum(n / i))%moder;
                    }
                    if (i * i != n && n / i >= m){
                        res = (res + n/i*eular_sum(i))%moder;
                    }
                }
            }
            printf("%lld
    ",res);
        }
        return 0;
    }

    //求欧拉函数(即n以内所有与n互质的数的个数) 

    // 设n的质因数分别为p1,p2,.....,pn 

    //f(x)=n*(1-p1)*(1-p2)*...*(1-pn)

    //求与n互质的数之和S(x)=f(x)/2*x 

  • 相关阅读:
    hdu 4612 Warm up 桥缩点
    树上的一个题目
    2013 ACM/ICPC Asia Regional Online —— Warmup2
    hdu 3308 LCIS 线段树
    最近计划
    hdu 2121 , hdu 4009 无定根最小树形图
    POJ 3164 Command Network 最小树形图模板
    过滤器和拦截器
    struts中的请求数据自动封装
    struts中获取域
  • 原文地址:https://www.cnblogs.com/cunyusup/p/8490646.html
Copyright © 2011-2022 走看看