您的位置:首页 > 其它

CSU 1803: 2016

2016-09-07 12:48 274 查看
题目:


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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: