标签:++ span 统计 init for gcd str 数据 转化
题意:求
题解:这题...数据范围是真小...
研究一下这一表达式,发现gcd(i,j)=1表示i,j互质,那么互质肯定能想到欧拉函数,可是欧拉函数要求j<i,那么我们变化一下:显然原矩阵是对称的,所以可以转化一下,变成
(注意到后面-1是为了防止(1,1)被重复统计)
那么发现答案就是
公式挂掉的地方见博客:https://blog.csdn.net/lleozhang/article/details/83419761
#include <cstdio> #include <cmath> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> #include <queue> #include <stack> using namespace std; int pri[40005]; int phi[40005]; bool used[40005]; int tot=0; int n; void init() { scanf("%d",&n); if(n==1) { printf("0\n"); return; } n--; int ans=1; for(int i=2;i<=n;i++) { if(!used[i]) { pri[++tot]=i; phi[i]=i-1; } for(int j=1;j<=tot&&i*pri[j]<=n;j++) { used[i*pri[j]]=1; if(i%pri[j]==0) { phi[i*pri[j]]=phi[i]*pri[j]; break; }else { phi[i*pri[j]]=phi[i]*(pri[j]-1); } } ans+=phi[i]; } ans*=2; ans++; printf("%d\n",ans); } int main() { init(); return 0; }
标签:++ span 统计 init for gcd str 数据 转化
原文地址:https://www.cnblogs.com/zhangleo/p/9858365.html