神炎皇

来源:互联网 发布:长沙unity3d招聘 编辑:程序博客网 时间:2024/06/05 14:50

Limite

Time Limite:1 sec
Memory Limite:512 megabytes

Description

神炎皇乌利亚很喜欢数对,他想找到神奇的数对。
已知n,对于一个正整数对(a,b),若满足a+bna+bab的因子,则为神奇的数对。请问这样的数对共有多少呢?

Data

对于20%的数据n1000
对于40%的数据n100000
对于60%的数据n10000000
对于80%的数据n1000000000000
对于100%的数据n100000000000000

Solution

gcd(a,b)=d
(ad+bd) | (abd2)
(a+b) | (abd)
(a+b) | (d)
(a+b)n

k=a+b,那么枚举k,就有nk2d的取值。
那么(a,b)的对数为ϕ(k)对。
用线性筛即可。
时间复杂度:O(n)

Code

#include<bits/stdc++.h>#define M 10000010#define ll long long#define INF 0x3f3f3f3f#define FOR(a,b,c) for(int a=(b),a##_end=(c);a<=a##_end;++a)#define ROF(a,b,c) for(int a=(b),a##_end=(c);a>=a##_end;--a)using namespace std;ll n,ans;int Sz,p[M],euler[M];int main(){    scanf("%lld",&n);    FOR(i,2,(int)sqrt(n))euler[i]=i-1;    FOR(i,2,(int)sqrt(n)){        if(euler[i]==i-1)            p[++Sz]=i;        for(int j=1;j<=Sz&&1ll*i*p[j]<=i_end;++j){            if(i%p[j]==0){                euler[i*p[j]]=euler[i]*p[j];                break;            }            euler[i*p[j]]=euler[i]*(p[j]-1);        }        ans+=n/i/i*euler[i];    }    printf("%lld\n",ans);    return 0;}
原创粉丝点击