首页 > 代码库 > luogu P2158 [SDOI2008]仪仗队
luogu P2158 [SDOI2008]仪仗队
题目描述
作为体育委员,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;}
一起求版
#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;}
luogu P2158 [SDOI2008]仪仗队
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。