hdu3501http://acm.hdu.edu.cn/showproblem.php?pid=3501

//题意:给你一个数 n 求不大于n且与n非互质的数的和。

// 欧拉函数  小于或等于n且与n互质的个数

//做这道题目: 要想真正掌握一些知识 你必须研究透彻。

//小于test与test互质的数的和test*Phi(test)/2;
//其中phi(test)代表test欧拉函数的个数。
// 同时今天也学习了( 指数幂 求约数的个数) 

//20  2^2*5-- (2+1)*(1+1)=6;

#include<stdio.h>
#include<math.h>
#define  max   1000000007
long long phi(long long n)//求欧拉函数的个数
{
    if(n==1) return 1;
    long long i=2,m=n,big=(long long)sqrt((double)m);
    while(i<=big)
    {
        if(m%i==0)
        {
            n-=n/i;//利用容斥原理 把包含i约数的数的个数全部清除。
            do
            {
                m/=i;
            }
            while(m%i==0);
            big=(long long)sqrt((double)m);
        }
        i++;
    }
    if(m!=1)
    {
        n-=n/m;
    }
    return n;
}
int main()
{
    long long test,ans;
    while(scanf("%lld",&test),test)
    {
         ans=((test*(test-1))/2)%max;
         ans-=(phi(test)*test/2)%max;
         if(ans<0)
             ans+=max;
         printf("%lld\n",ans);

    }
    return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值