JZOJ 4919. 【NOIP2017提高组模拟12.10】神炎皇
2016-12-12 19:42
465 查看
Description
神炎皇乌利亚很喜欢数对,他想找到神奇的数对。对于一个整数对 (a,b),若满足 a+b<=n 且 a+b 是 ab 的因子,则成为神奇的数对。请问这样的数对共有多少呢?
Input
一行一个整数n。Output
一行一个整数表示答案,保证不超过64位整数范围。Sample Input
21Sample Output
11Data Constraint
对于20%的数据 n<=103;对于40%的数据 n<=105;
对于60%的数据 n<=106;
对于80%的数据 n<=1012;
对于100%的数据 n<=1014。
Solution
观察a+b<=n 且 a+b|ab使d=Gcd(a,b)必然 d>1 才能使 a+b|ab
则a=a′d,b=b′d
可知Gcd(a′,b′)=1
推出Gcd(a′+b′,b′)=1
所以a+b|ab=>(a′+b′)d|a′b′d2=>a′+b′|a′b′d
因为a′+b′∤a′b′
所以a′+b′|d
又设d=c(a′+b′)
则a+b=d(a′+b′)=(a′+b′)2⋅p≤n 且 p>0
所以a′+b′≤n√
设k=a′+b′,之后枚举 k。
由于p可能的取值为⌊nk2⌋
由Gcd(a′+b′,b′)=1得Gcd(k,b′)=1
那么b’的取值就是φ(k)
所以答案就是∑k=1n√k∗⌊nk2⌋∗φ(k)
因为 φ(k) 可以用线性筛法求出!
最终时间复杂度就是O(n√)
Code
#include<cstdio> #include<cmath> using namespace std; typedef long long LL; const int N=10000001; int m; LL n,ans; int f ,phi ; bool bz ; int main() { scanf("%lld",&n); m=sqrt(n); for(int i=2;i<=m;i++) { if(!bz[i]) phi[f[++f[0]]=i]=i-1; for(int j=1;j<=f[0] && i*f[j]<=m;j++) { bz[i*f[j]]=true; if(i%f[j]==0) { phi[i*f[j]]=phi[i]*f[j]; break; }else phi[i*f[j]]=phi[i]*(f[j]-1); } }//线性筛法 for(int i=2;i<=m;i++) ans+=n/(1LL*i*i)*1LL*phi[i]; printf("%lld",ans); return 0; }
相关文章推荐
- JZOJ 4919. 【NOIP2017提高组模拟12.10】神炎皇
- 【JZOJ4919】【NOIP2017提高组模拟12.10】神炎皇
- JZOJ4919. 【NOIP2017提高组模拟12.10】神炎皇
- 【JZOJ4921】【NOIP2017提高组模拟12.10】幻魔皇
- 【JZOJ4920】【NOIP2017提高组模拟12.10】降雷皇
- JZOJ 4919.【NOIP2017提高组模拟12.10】神炎皇
- JZOJ 4921. 【NOIP2017提高组模拟12.10】幻魔皇
- JZOJ 5404. 【NOIP2017提高A组模拟10.10】Graph
- {题解}[jzoj4924]【NOIP2017提高组模拟12.17】向再见说再见
- JZOJ 4932. 【NOIP2017提高组模拟12.24】B
- 【jzoj5350】【NOIP2017提高A组模拟9.7】【陶陶摘苹果】【动态规划】
- JZOJ5361. 【NOIP2017提高A组模拟9.14】捕老鼠
- JZOJ 100035. 【NOIP2017提高A组模拟7.10】区间
- JZOJ 5393. 【NOIP2017提高A组模拟10.5】Snake vs Block
- [JZOJ5395]【NOIP2017提高A组模拟10.6】Count
- JZOJ 5398. 【NOIP2017提高A组模拟10.7】Adore
- jzoj5400. 【NOIP2017提高A组模拟10.7】Repulsed
- JZOJ5399. 【NOIP2017提高A组模拟10.7】Confess bitset
- JZOJ 5405. 【NOIP2017提高A组模拟10.10】Permutation
- JZOJ 4933. 【NOIP2017提高组模拟12.24】C