CSU 1803: 2016
2016-09-07 12:48
274 查看
题目:
给出正整数 n 和 m,统计满足以下条件的正整数对 (a,b) 的数量:
1. 1≤a≤n,1≤b≤m;
2. a×b 是 2016 的倍数。
输入包含不超过 30 组数据。
每组数据包含两个整数 n,m (1≤n,m≤109).
对于每组数据,输出一个整数表示满足条件的数量。
这个题目直接枚举g=gcd(a,2016)即可
2016=2*2*2*2*2*3*3*7,所以g有6*3*2=36种情况。
对于每个g,求a满足gcd(a,2016)恰好是g,求b使得2016| a*b
一,求a满足gcd(a,2016)恰好是g
即求1,2,3......n/g这些数中,有多少个和2016/g互质,用容斥原理即可
二,求b使得2016| a*b
即求1,2,3......m这些数中,有多少个是2016/g的倍数,答案就是m*g/2016
代码:
Description
给出正整数 n 和 m,统计满足以下条件的正整数对 (a,b) 的数量:1. 1≤a≤n,1≤b≤m;
2. a×b 是 2016 的倍数。
Input
输入包含不超过 30 组数据。每组数据包含两个整数 n,m (1≤n,m≤109).
Output
对于每组数据,输出一个整数表示满足条件的数量。
Sample Input
32 63 2016 2016 1000000000 1000000000
Sample Output
1 30576 7523146895502644
这个题目直接枚举g=gcd(a,2016)即可
2016=2*2*2*2*2*3*3*7,所以g有6*3*2=36种情况。
对于每个g,求a满足gcd(a,2016)恰好是g,求b使得2016| a*b
一,求a满足gcd(a,2016)恰好是g
即求1,2,3......n/g这些数中,有多少个和2016/g互质,用容斥原理即可
二,求b使得2016| a*b
即求1,2,3......m这些数中,有多少个是2016/g的倍数,答案就是m*g/2016
代码:
#include<iostream> using namespace std; int n, m; long long f(int g) { int nn = n / g; long long s = nn - (1008 % g == 0)*nn / 2 - (672 % g == 0)*nn / 3 - (288 % g == 0)*nn / 7; s += (336 % g == 0)*nn / 6 + (96 % g == 0)*nn / 21 + (144 % g == 0)*nn / 14 - (48 % g == 0)*nn / 42; long long gg = g; return gg*m / 2016 * s; } long long f7(int g) { return f(g) + f(g * 7); } long long f5(int g) { return f7(g) + f7(g * 3) + f7(g * 9); } int main() { while (cin >> n >> m)cout << f5(1) + f5(2) + f5(4) + f5(8) + f5(16) + f5(32) << endl; return 0; }
相关文章推荐
- [CSU 1803(湖南省赛16)] 2016 (数论+模运算)
- CSU 1803:2016(数论)
- CSU 1803 2016(思维)
- J - 2016 CSU - 1803
- CSU1803 2016 同余
- CSU 1803 2016(思维)
- 湖南省第十二届大学生程序设计竞赛A题 2016 (csuoj1803)
- CSU 1803 2016(思维)
- csu 1803 2016 2016湖南省赛 A
- CSU 1803 2016(思维)
- CSU 1803: 2016
- 2016-CSU1803(同余公式)
- CSU 1803 2016(思维)
- CSU 1803 2016 (逆向思维)
- csu 1803(2016)
- CSU 1803 2016 (数论+思路)
- CSU 1803 2016(思维)
- CSU 1803 2016
- CSU 1803 2016(思维)
- CSU 1803 2016