bzoj 2190: [SDOI2008]仪仗队
2016-05-10 20:55
471 查看
2190: [SDOI2008]仪仗队
Description
作为体育委员,C君负责这次运动会仪仗队的训练。仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视线所及的学生人数来判断队伍是否整齐(如下图)。现在,C君希望你告诉他队伍整齐时能看到的学生人数。
Input
共一个数N。Output
共一个数,即C君应看到的学生人数。Sample Input
4Sample Output
9HINT
【数据规模和约定】对于 100% 的数据,1 ≤ N ≤ 40000
题解:
n^2的枚举应该是很好写的,先把所有的点都连线,枚举点的坐标,判断gcd(i,j)的值,若大于1即表示中间有点在连线之间
#include<stdio.h> #include<iostream> using namespace std; int n,i,j,ans; int gcd(int a,int b) { if(b==0) return a; if(a%b==0) return b;else gcd(b,a%b); } int main() { scanf("%d",&n); ans=n*n-1; for(i=0;i<n;i++) for(j=0;j<n;j++) if(i!=0||j!=0) { if(gcd(i,j)-1) ans--; } cout<<ans; return 0; }
首先j可以只枚举小于等于i的部分,再乘2(注意i==j的情况)
那么对于当前i的答案就是总数减去与i互质的个数(用欧拉函数)
#include<stdio.h> #include<iostream> #include<math.h> using namespace std; int n,i,j,k,ans,sum,p[40005],a[40004]; int gcd(int a,int b) { if(b==0) return a; if(a%b==0) return b;else gcd(b,a%b); } int main() { scanf("%d",&n); p[1]=1; for(i=2;i<=n;i++) if(p[i]==0) for(j=2;j<=n/i;j++) p[i*j]=1; ans=n*n-1; for(i=2;i<n;i++) { k=0; for(j=1;j<=(int)(sqrt(i));j++) if(i%j==0) { if(p[j]==0) { k++; a[k]=j; } if(i/j!=j&&p[i/j]==0) { k++; a[k]=i/j; } } sum=i; for(j=1;j<=k;j++) sum=sum*(a[j]-1)/a[j]; sum=i-sum; ans-=sum*2+1; } cout<<ans; return 0; }
相关文章推荐
- 全文索引----中文分词器mmseg4j
- C#目录操作 Path类与Directory类
- NYOJ - 171 聪明的kk
- CMake入门指南-编译教程
- Session里存的密码或其他信息如何获取。
- bzoj 4403: 序列统计
- Qt CS架构 客户端代码编写技巧 QTcpSocket
- 程序员日常
- lintcode_单词切分
- 树——判断是否为平衡二叉树
- int main(int argc,char* argv[]),int main(int argc,char** argv)
- linux启动是自动加载的几个文件说明bashrc等 .
- C# + WinForm + EmguCV 学习二:创建和操作图片
- C语言 旋转数组的最小数字
- Android:获取屏幕信息(宽高)的代码
- qt5.0串口写数据返回为-1的问题
- acm_十进制转二进制
- snmpsharpnet的Trap实例
- C# 泛型
- tensorflow implementation of latest papers