HDU-1796 How many integers can you find || POJ-3695 Rectangles || POJ-3904 Sky Code
2015-09-07 15:49
477 查看
题目:
3道容斥原理的题,抓紧时间再学点东西。http://acm.hdu.edu.cn/showproblem.php?pid=1796
http://poj.org/problem?id=3695
http://poj.org/problem?id=3904
HDU-1796 How many integers can you find:
POJ-3695 Rectangles:
/article/10441329.htmlPOJ-3904 Sky Code:
题意:
求数列中有多少组4个数字,它们的最大公约数的1.思路:
只要4个数没有共同的质因子就满足最大公约数为1.所以只要把整个数列中所有4个数的组合总数减去有同一质因子的4个数的组合数,但是会有重复,4个数可能有不止一个共同的质因子,所以就要再加上有两个共同质因子的数,就是有两个质因子组成的合数因子的组合数,如此……也就是求出每个数的所有质因子,然后找出这些质因子的所有组合可能,把这个数加入组有的这些因子的集合中,最后按因子所包含质因子的奇偶把最后的组合数加减在答案上。代码:
#define N 11234 int n,m; long long a ,b ,pri ,flag ; void init() { for(long long i=4;i<N;i++) b[i] = i*(i-1)*(i-2)*(i-3)/24; } void solve(int now) { int cnt=0; for(int i=2;i*i<=now;i++) if(now%i==0) { pri[cnt++]=i; while(now>1&&now%i==0) now/=i; } if(now!=1) pri[cnt++] = now; for(int i=1;i<(1<<cnt);i++) { int mark=-1,temp=1; for(int j=0;j<cnt;j++) if(i&(1<<j)) mark=-mark,temp*=pri[j]; a[temp]++; flag[temp]=mark; } } int main() { int i,j,k,kk,t,x,y,z; init(); while(scanf("%d",&n)!=EOF&&n) { memset(a,0,sizeof(a)); for(i=0;i<n;i++) { scanf("%d",&t); solve(t); } long long sum=0; for(i=1;i<N;i++) if(a[i]) { if(flag[i]==1) sum+=b[a[i]]; else if(flag[i]==-1) sum-=b[a[i]]; } printf("%lld\n",b -sum); } return 0; }
相关文章推荐
- 文件工具类,一些常用的文件方法
- 计算机基础
- fruitstrap 安装.app文件
- iOS开发-UIImageView响应点击事件
- C++中赋值运算符与逗号运算符的用法详解
- 冒泡排序
- 将eclipse的显示语言改为英文(有时安装的插件显示为中文的)
- 模仿QQ、微信表情输入框
- 用c编写一个my2DAlloc函数。
- KNN 在手写识别中的应用(Java 实现)
- 如何掌握一项新技能
- 选出N个不重复的随机数
- 内联函数与宏的简单说明
- nginx控制单个ip连接数及流量控制
- ant java命令 官方文档
- 汉字转拼音
- 读取SQL生成txt文件
- 显示定义copy构造函数实现
- Android Studio使用笔记
- 图片转文字