hdu
来源:互联网 发布:绥化学院教务管理网络 编辑:程序博客网 时间:2024/05/17 23:22
Given a positive integer N, your task is to calculate the sum of the positive integers less than N which are not coprime to N. A is said to be coprime to B if A, B share no common positive divisors except 1.
340
02
题目给出n,让求小于n且不与n互质的数的和
首先欧拉函数Euler(n)是求小于n且与n互质的数的个数,再有gcd的性质:如果gcd(n,i)=1,则gcd(n,n-i)=1
那么,可以看做在[1,n-1]中与n互质的数是成对出现的,即如果i与n互质,则(n-i)也与n互质(Euler(n)为偶数)。而且可以发现这对数(i与n-i)的和为n。
进一步得到结论:小于n且与n互质的数的和为n*Euler(n)/2;
那么对于此题课先求1~n的和,再减去n*Euler(n)/2
代码:
#include<iostream>#include<string>#include<cstdio>#include<algorithm>#include<cmath>#include<iomanip>#include<queue>#include<cstring>#include<map>using namespace std;typedef long long ll;#define mod 1000000007ll n;ll euler_phi(ll n){ ll m=(ll)sqrt(n+0.5); ll ans=n; for(ll i=2;i<=m;i++) { if(n%i==0) { ans=ans/i*(i-1); while(n%i==0) n/=i; } } if(n>1) ans=ans/n*(n-1); return ans;}int main(){ while(scanf("%lld",&n)!=EOF) { if(n==0) break; ll ans=(n*(n-1)/2)%mod; //求1~n的和 ans=(ans-(n*euler_phi(n)/2)%mod+mod)%mod; printf("%lld\n",ans); } return 0;}
在做这个题的同时发现上面代码200多ms,而有人只有15ms,那么我认为一定是欧拉函数不同造成
于是同下面欧拉函数时间为15 ms
ll euler_phi(ll n){ ll ans=n; for(ll i=2;i*i<=n;i++) if(n%i==0) { ans-=ans/i; while(n%i==0) n/=i; } if(n>1) ans-=ans/n;; return ans;}
用下面欧拉函数为171ms
ll euler_phi(ll n){ ll ans=n; ll m=(ll)sqrt(n+0.5); for(ll i=2;i<=m;i++) { if(n%i==0) { ans-=ans/i; while(n%i==0) n/=i; } } if(n>1) ans-=ans/n;; return ans;}下面280ms
ll euler_phi(ll n){ ll ans=n; ll m=(ll)sqrt(n+0.5); for(ll i=2;i<=m;i++) if(n%i==0) { ans-=ans/i; while(n%i==0) n/=i; } if(n>1) ans-=ans/n;; return ans;}
其中缘由我不清楚,但还是用快的吧
阅读全文
0 0
- hdu
- hdu
- HDU
- hdu ()
- hdu
- hdu
- HDU
- HDU
- hdu
- hdu
- HDU
- Hdu
- hdu
- hdu-
- hdu
- hdu
- hdu
- HDU
- JAVA【多线程一】
- GAN之根据文本描述生成图像
- CCFJson查询之Java实现代码
- tornado_5_异步web服务
- 在jsp里面简单分页
- hdu
- Qt信号和槽机制
- git权威指南总结七:git merge冲突解决
- Java练习题18 JPanel面板
- js实现倒计时
- Spark概念理解
- python中range, xrange, arange的区别与应用示例
- python的socket模块
- 05.去,走你想要的人生——有条理地生活:秩序即是力量(笔记)