BZOJ2190 SDOI2008 仪仗队
这题目一看数学色彩就很浓
通过观察图(这个。。)我们就可以发现,如果按对角线剖分的话,两边可以看到的学生数都恰好是1~n-1范围内的互质数对数,即sigma(phi(i))
phi就是欧拉函数,关于线性求欧拉函数可以点这里:
http://blog.csdn.net/ji414341055/article/details/5771066
那么这题就基本已经解决了,答案就是1~n-1的欧拉函数和*2-1,需要注意的还有两个地方:开unsigned long long和特判n<2的情况
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | #include <iostream> #include <cstdio> #include <cmath> #include <cstdlib> #include <algorithm> #include <cstring> #define ll long long #define ull unsigned long long using namespace std; bool f[40001]; ull p[40001]; ull ans[40001]; int main(){ int n,tot=0; cin >>n; if (n<=1){ cout <<0 <<endl; return 0; } memset (f, false , sizeof (f)); f[1]= true ; for ( int i=2;i<=n;i++){ if (!f[i]){ p[++tot]=i; ans[i]=i-1; } for ( int j=1;(j<=tot)&&(i*p[j]<=n);j++){ f[i*p[j]]= true ; if (i%p[j]==0){ ans[i*p[j]]=ans[i]*p[j]; break ; } else { ans[i*p[j]]=ans[i]*(p[j]-1); } } } long long pr=2; for ( int i=2;i<=n-1;i++) pr+=ans[i]; cout <<pr*2-1 <<endl; return 0; } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步