JZOJ 4919. 【NOIP2017提高组模拟12.10】神炎皇
生活随笔
收集整理的這篇文章主要介紹了
JZOJ 4919. 【NOIP2017提高组模拟12.10】神炎皇
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Description
神炎皇烏利亞很喜歡數對,他想找到神奇的數對。
對于一個整數對 (a,b),若滿足 a+b<=n 且 a+b 是 ab 的因子,則成為神奇的數對。請問這樣的數對共有多少呢?
Input
一行一個整數n。
Output
一行一個整數表示答案,保證不超過64位整數范圍。
Sample Input
21
Sample Output
11
Data 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[N],phi[N]; bool bz[N]; 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】神炎皇的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JZOJ 4910. 【NOIP2017
- 下一篇: c++ 二分查找的函数 lower_bo