hdu 1695 GCD(组合数学:容斥原理)
来源:互联网 发布:5g网络4g手机能用吗 编辑:程序博客网 时间:2024/05/16 03:30
判断1-b和1-d之间有多少个(x,y)组合可以使gcd(x, y)==k
且认为(x,y)和(y,x)等价
直接令b /= k d /= k
找到使gcd(x,y)==1的个数即可
例如样例:
1 6 1 8 1
令y = i, x <= y 且x ~[ 1, b ]
(x,1):1个
(x,2):2-1=1个【(2,2)舍弃】
(x,3):3-1=2个【(3,3)舍弃】
(x,4):4-2=2个【(2,4)(3,4)舍弃】
(x,5):5-1=4个【(5,5)舍弃】
(x,6):6-3-2+1=2个【(2,6)(3,6)(4,6)(6,6)舍弃】
(x,7):6-0=6个//x最大为6,下同
(x,8):6-3=6个【(2,8)(4,8)(6,8)舍弃】
其中(x,6):6-3-2+1=2个就是典型的容斥定理应用
6的质因子有2 3
6中6/2=3个2的倍数必然不与6互质
6中6/3=2个3的倍数必然不与6互质
6中6/(2×3)=1个6的倍数必然不与6互质
6-3-2的过程多减去一个6,所以要再加上6/6
所以这个题的思路是先打表保存每个数的素因子,再依次dfs即可
这道题很奇葩的一点就是输出时用long long会WA,而用%I64d就过了。。。
代码如下:
//#include <bits/stdc++.h>#include <vector>#include <cstdio>#include <iostream>#include <cstring>#include <algorithm>#define MAXN 100005#define LL long longusing namespace std;bool vis[MAXN+10];vector<int> vec[MAXN+10];void get_fac(int n) { memset(vis, 0, sizeof(vis)); for(int i=0; i<n; ++i) vec[i].clear(); for(int i=2; i<n; ++i) { if(!vis[i]) { for(int j=1; j*i<n; ++j) { vis[i*j] = true; vec[i*j].push_back(i); } } }}int dfs(int u, int s, int w) { int cnt = 0, v = 1; for(int i=0; i<vec[w].size(); ++i) { if((1<<i) & s) { ++cnt; v *= vec[w][i]; } } int tmp = u/v; if(cnt & 1) return tmp; return -tmp;}int main(void) { get_fac(MAXN); int T, a, b, c, d, k; scanf("%d", &T); for(int t=1; t<=T; ++t) { scanf("%d%d%d%d%d", &a, &b, &c, &d, &k); if(k == 0) { printf("Case %d: 0\n", t); continue; } b /= k; d /= k; if(b > d) { b ^= d; d ^= b; b ^= d; } LL ans = 0ll; for(int i=1; i<=d; ++i) { k = min(i, b); ans += k; for(int j=1; j<(1<<vec[i].size()); ++j) { //printf("dfs(%d, %d, %d) = %d\n", k, j, i, dfs(k, j, i)); ans -= dfs(k, j, i); } } printf("Case %d: ", t); cout << ans << endl; } return 0;}
0 0
- hdu 1695 GCD(组合数学:容斥原理)
- HDU 1695 GCD (数论-整数和素数,组合数学-容斥原理)
- HDU 1695 GCD (数论-整数和素数,欧拉函数,组合数学-容斥原理)
- HDU 4675GCD of Sequence(大组合数取模 容斥原理 组合数学)
- HDU 1695 GCD(容斥+组合)
- HDU 1695:GCD _容斥原理
- HDU 1695 GCD 【数论,容斥原理】
- Hdu 1695 GCD (数论 容斥原理)
- [容斥原理] hdu 1695 GCD
- 【容斥原理】HDU 1695 GCD
- HDU-1695-GCD +素数+容斥原理
- hdu 1695 GCD 容斥原理
- HDU 1695 GCD (容斥原理)
- hdu 1695 GCD(容斥原理)
- hdu 1695 GCD(容斥原理)
- 组合数学第三发 容斥原理 hdu 1796
- HDU 5073 Coprime(容斥原理+组合数学)
- hdu 2204 Eddy's爱好 [容斥原理]【组合数学】
- 程序员赚钱的头脑
- 二叉树学习-已知中序、后序,求先序
- openCV 在vc2008中的配置方法
- cin.get和cin.getline在读取一整行时的区别
- 关于性能测试模型的探讨(转)
- hdu 1695 GCD(组合数学:容斥原理)
- BCBTGifImage显示GIF动画
- poj2240 Arbitrage(floyd)
- 灰度公式
- 主线程中的handle问题
- 十大编程算法助程序员走上大神之路
- java解压缩/压缩/加密压缩/加密解压缩 ZIP4J---ZIP文件压缩与解压缩学习
- IOS用CGContextRef画各种图形(文字、圆、直线、弧线、矩形、扇形、椭圆、三角形、圆角矩形、贝塞尔曲线、图片)
- 二叉树——已知先序、中序,求后序