HDU 5608 function(数论)
来源:互联网 发布:张氏短打淘宝 编辑:程序博客网 时间:2024/06/08 13:27
Description
Input
第一行一正整数T表示用例组数,每组用例占一行为一整数n(T<=300,n<=10^9,只有五组用例n>10^6)
Output
对于每组用例输出一个答案
Sample Input
1
3
Sample Output
2
Solution
Code
#include<cstdio>#include<iostream>#include<map>using namespace std;typedef long long ll;#define maxn 1111111#define mod 1000000007#define inv (mod+1)/3map<int,int>m;map<int,int>::iterator it;int ans[maxn];void init(){ for(int i=1;i<maxn;i++)ans[i]=1ll*(i-1)*(i-2)%mod; for(int i=1;i<maxn;i++) for(int j=2*i;j<maxn;j+=i) { ans[j]-=ans[i]; if(ans[j]<0)ans[j]+=mod; } for(int i=2;i<maxn;i++) { ans[i]+=ans[i-1]; if(ans[i]>=mod)ans[i]-=mod; }}int solve(int n){ if(n<maxn)return ans[n]; it=m.find(n); if(it!=m.end())return it->second; int cnt=1ll*n*(n-1)%mod*(n-2)%mod*inv%mod; for(int i=2,next;i<=n;i=next+1) { next=n/(n/i); cnt-=1ll*(next-i+1)*solve(n/i)%mod; if(cnt<0)cnt+=mod; } return m[n]=cnt;}int main(){ init(); int T,n; scanf("%d",&T); while(T--) { m.clear(); scanf("%d",&n); printf("%d\n",solve(n)); } return 0;}
0 0
- HDU 5608 function(数论)
- HDU 2204 (数论)
- hdu 1722(数论)
- hdu 1492(数论)
- hdu 2554 (数论)
- hdu 2964 (数论)
- hdu 2421 (数论)
- hdu 2608(数论)
- hdu 2446(数论)
- HDU 1060(数论)
- hdu 5391 (数论)
- hdu 5478 (数论)
- hdu 5812(数论)
- HDU 1042(数论)
- [杜教筛] HDU 5608 function
- hdu 5608 function
- hdu 5608 function
- Function (HDU 6038)
- Shell编程(3):运算符
- AutoLayout的那些事(二)
- Linux下使用maven+svn构建Java项目
- 请求转发和重定向
- VLAN原理详解
- HDU 5608 function(数论)
- js事件冒泡、事件捕获和阻止默认事件详解
- c#学习笔记(一)
- @Value
- RVDS4.0硬件仿真,同步显示C代码,完全取代RVDS2.2
- android上传下载系列:断点上传&断点下载对比一览
- 修改dmp文件的表空间
- 1042. Shuffling Machine (20)
- log4j配置文档