當前位置:
首頁 >
bzoj2190 [SDOI2008]仪仗队(欧拉函数)
發布時間:2025/4/16
35
豆豆
生活随笔
收集整理的這篇文章主要介紹了
bzoj2190 [SDOI2008]仪仗队(欧拉函数)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
2190: [SDOI2008]儀仗隊
Time Limit:?10 Sec??Memory Limit:?259 MBSubmit:?3203??Solved:?2062
[Submit][Status][Discuss]
Description
作為體育委員,C君負責這次運動會儀仗隊的訓練。儀仗隊是由學生組成的N * N的方陣,為了保證隊伍在行進中整齊劃一,C君會跟在儀仗隊的左后方,根據其視線所及的學生人數來判斷隊伍是否整齊(如下圖)。 ?? 現在,C君希望你告訴他隊伍整齊時能看到的學生人數。
Input
共一個數N。
Output
共一個數,即C君應看到的學生人數。
Sample Input
4Sample Output
9HINT
【數據規模和約定】 對于 100% 的數據,1 ≤ N ≤ 40000
?
/* 可以將最左下的點標為(0,0), 那么顯然如果存在一個點(x,y), 且有gcd(x; y) = k (k .= 1), 那么點(x/k,y/k) .定會將點(x,y) 擋住. 如果k = 1, 那么點(x, y) .定會被看到 所以點(x, y)被看到的充分必要條件是Gcd(x, y) == 1; 我們考察矩陣的下三角形,考察他的每一行,可以發現,這一行能夠被看到的點的數目就是phi(x) 答案不難發現是∑(phi[x])*2+1(容斥原理) */ #include<iostream> #include<cstdio> #include<cstring>#define N 50007using namespace std; int prime[N]; bool not_prime[N]; int n,ans,tot=1;void pr_() {prime[1]=2;not_prime[1]=true;for(int i=2;i<=N;i++){if(!not_prime[i]) prime[++tot]=i;for(int j=1;j<=tot && i*prime[j]<=N;j++){not_prime[i*prime[j]]=true;if(i%prime[j]) break;}} }int get_phi(int x) {int ret=1;for(int i=1;prime[i]*prime[i]<=x;i++){if(x%prime[i]==0){ret*=prime[i]-1;x/=prime[i];while(x%prime[i]==0) x/=prime[i],ret*=prime[i];}}if(x>1) ret*=x-1;return ret; }int main() {scanf("%d",&n);pr_();for(int i=1;i<n;i++) ans+=get_phi(i);ans*=2;ans+=1;printf("%d\n",ans);return 0; }?
轉載于:https://www.cnblogs.com/L-Memory/p/7241727.html
總結
以上是生活随笔為你收集整理的bzoj2190 [SDOI2008]仪仗队(欧拉函数)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java之yield(),sleep()
- 下一篇: BZOJ 2244: [SDOI2011