【题目链接】
http://www.lydsy.com/JudgeOnline/problem.php?id=2818
【题意】
问(x,y)为质数的有序点对的数目。
【思路】
定义f[i]表示i之前(x,y)=1的有序点对的数目,则有递推式:
f[1]=1
f[i]=f[i-1]+phi[i]*2
我们依次枚举小于n的所有素数,对于素数t,(x,y)=t的数目等于(x/t,y/t),即f[n/t]。
【代码】
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 using namespace std; 5 6 typedef long long ll; 7 const int N = 1e7+10; 8 9 int su[N],tot,phi[N]; 10 ll f[N]; 11 12 void get_pre(int n) 13 { 14 phi[1]=1; 15 for(int i=2;i<=n;i++) if(!phi[i]) { 16 su[++tot]=i; 17 for(int j=i;j<=n;j+=i) { 18 if(!phi[j]) phi[j]=j; 19 phi[j]=phi[j]/i*(i-1); 20 } 21 } 22 f[1]=1; 23 for(int i=2;i<=n;i++) f[i]=f[i-1]+2*phi[i]; 24 } 25 26 int n; 27 28 int main() 29 { 30 scanf("%d",&n); 31 get_pre(n); 32 ll ans=0; 33 for(int i=1;i<=tot;i++) 34 ans+=f[n/su[i]]; 35 printf("%lld\n",ans); 36 return 0; 37 }
时间: 2024-10-23 05:22:06