P2158 P1447 一蓝一紫
chenhaotian0219 · · 个人记录
这是我的第一篇博客!!!!!
今天我们来看一道蓝题 P2158
注意:下文的 / 皆指整数除法
>>作者主页<<
>>题目链接<<
[SDOI2008] 仪仗队
题目描述
作为体育委员,C 君负责这次运动会仪仗队的训练。仪仗队是由学生组成的
现在,C 君希望你告诉他队伍整齐时能看到的学生人数。
一、基础说明,求出公式
我们设 左数第
那么,C 君的坐标为
现在我们即对题目完成建模:在一个从
那么如何判定一个点是否看得到呢?
我们假设对于一个存在的点
即对任意整点
也就是说,对于一个点
而对于任意满足
根据
所以我们得出结论:一个点
我觉得我说的很清楚了吧!
还是不会的出门左拐去这里 >>绿色通道<<
好的,需要求的就是:
(
二、 gcd(x,y)=n 的 x,y 有多少?
那么我们设
这个比较难求,对吧?
我们可以求出
易见
其实
那么,我们只需要倒着算
递推公式为
那么答案正是
g[1]+2
三、食用代码区
不说话,直接上代码!
#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int n,g[N];
int main(){
cin >> n;
if(n==1){
cout << 0;
return 0;
}//特判
for(int i=n-1;i>0;i--){
g[i]=((n-1)/i)*((n-1)/i);
// 这边我没有设s,直接把g[i]的初始值设成s了
for(int j=i*2;j<n;j+=i)
g[i]-=g[j];
}
cout << g[1]+2;
return 0;
}