bzoj2190: [SDOI2008]仪仗队(欧拉函数)
2017-10-27 08:40
393 查看
题目传送门
基础太弱导致我现在才去学欧拉函数。
解法:
欧拉函数就是求小于等于x且与x互质的数的个数。
先把左下角换到左上角(等效)
把1,1看做原点。
斜率相同的点中只有一个点能看到。
斜率为(x-1)/(y-1)
那么只有互质的时候才是离原点最近的点。
所以我们就要求与每一个x-1互质个个数。
所以筛phi。然后求出ans=1~n-1的phi(欧拉函数)
然后因为欧拉函数求得是小于等于x的,所以ans就是对角线左边的方案数。
还有对角线右边的三角形,还有对角线上的第一个点。
所以最后答案是ans*2+1
代码实现:
基础太弱导致我现在才去学欧拉函数。
解法:
欧拉函数就是求小于等于x且与x互质的数的个数。
先把左下角换到左上角(等效)
把1,1看做原点。
斜率相同的点中只有一个点能看到。
斜率为(x-1)/(y-1)
那么只有互质的时候才是离原点最近的点。
所以我们就要求与每一个x-1互质个个数。
所以筛phi。然后求出ans=1~n-1的phi(欧拉函数)
然后因为欧拉函数求得是小于等于x的,所以ans就是对角线左边的方案数。
还有对角线右边的三角形,还有对角线上的第一个点。
所以最后答案是ans*2+1
代码实现:
#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int prime[11000],phi[41000]; int n; void get_phi() { //线性筛phi memset(phi,0,sizeof(phi)); phi[1]=1;int len=0; for(int i=2;i<=n;i++) { if(phi[i]==0) { prime[++len]=i; phi[i]=i-1; } for(int j=1;j<=len&&i*prime[j]<=n;j++) { int t=i*prime[j]; if(i%prime[j]==0) { phi[t]=phi[i]*prime[j];break; } phi[t]=phi[i]*(prime[j]-1); } } } int main() { scanf("%d",&n); get_phi(); int ans=0; for(int i=1;i<n;i++) ans+=phi[i]; printf("%d\n",ans*2+1); return 0; }
相关文章推荐
- bzoj 2190: [SDOI2008]仪仗队 线性欧拉函数
- bzoj 2190: [SDOI2008]仪仗队 -- 欧拉函数
- ♥BZOJ 2190: [SDOI2008]仪仗队【欧拉函数】
- BZOJ 2190: [SDOI2008]仪仗队 欧拉函数
- BZOJ-2190-仪仗队-SDOI2008-欧拉函数
- BZOJ 2190: [SDOI2008]仪仗队( 欧拉函数 )
- BZOJ-2190-仪仗队-SDOI2008-欧拉函数
- BZOJ 2190 [SDOI2008]仪仗队 欧拉函数
- [BZOJ 2190][SDOI2008]仪仗队:欧拉函数
- [BZOJ2190][SDOI2008]仪仗队(欧拉函数|莫比乌斯反演)
- bzoj 2190 [SDOI2008]仪仗队(欧拉函数)
- [bzoj2190][SDOI2008]仪仗队 ——欧拉函数
- bzoj 2190: [SDOI2008]仪仗队 欧拉函数
- BZOJ2190 [SDOI2008]仪仗队(欧拉函数)
- BZOJ 2190 [SDOI2008]仪仗队——欧拉函数
- [BZOJ2190] [SDOI2008] 仪仗队 - 欧拉函数
- [欧拉函数] bzoj2190: [SDOI2008]仪仗队
- 【bzoj2190】[SDOI2008]仪仗队 欧拉函数
- Bzoj2190:[SDOI2008]仪仗队:欧拉函数
- [bzoj 2190][SDOI2008]仪仗队(线性筛欧拉函数)