1. 程式人生 > >luogu P2158 [SDOI2008]儀仗隊

luogu P2158 [SDOI2008]儀仗隊

phi color can spa clu 判斷 9.png hide std

題目描述

作為體育委員,C君負責這次運動會儀仗隊的訓練。儀仗隊是由學生組成的N * N的方陣,為了保證隊伍在行進中整齊劃一,C君會跟在儀仗隊的左後方,根據其視線所及的學生人數來判斷隊伍是否整齊(如下圖)。 技術分享現在,C君希望你告訴他隊伍整齊時能看到的學生人數。

輸入輸出格式

輸入格式:

共一個數N

輸出格式:

共一個數,即C君應看到的學生人數。

輸入輸出樣例

輸入樣例#1:
4
輸出樣例#1:
9

說明

【數據規模和約定】

對於 100% 的數據,1 ≤ N ≤ 40000

不難發現

以C君為(0,0)點構成坐標系

只有該店的橫坐標與縱坐標互質時才能被看到

那麽就變成就歐拉函數問題

單個求歐拉版

技術分享
#include<cstdio>
using namespace std;
const int maxn = 1110101;
int oula[maxn];
int prime[maxn];
bool a[maxn];
int n;
int phi(int x)
{
    int ret=1;
    for(int i=2;i*i<=x;i++)
    {
        if(x%i==0)
        {
            ret*=i-1,x/=i;
            
while(x%i==0) { ret*=i;x/=i; } } } if(x>1)ret*=x-1; return ret; } int main () { scanf("%d",&n); int ans=0; for(int i=1;i<n;i++) { ans+=phi(i); } ans=ans*2,ans+=1; printf("%d\n"
,ans); return 0; }
View Code

一起求版

技術分享
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int n;
const int maxn =400004;
int phi[maxn];
void get_phi() {
    phi[1]=1;
    for(int i=2; i<=n; i++) {
        if(!phi[i])
            for(int j=i; j<=n; j+=i) {
                if(!phi[j])phi[j]=j;
                phi[j]=phi[j]/i*(i-1);
            }
    }
}
int main() {
    scanf("%d",&n);
    get_phi();
    int ans=0;
    for(int i=1; i<=n-1; i++)ans+=phi[i];
    printf("%d",2*ans+1);
    return 0;
}
View Code

luogu P2158 [SDOI2008]儀仗隊