Description
给出正整数 n 和 m,统计满足以下条件的正整数对 (a,b) 的数量:
1. 1≤a≤n,1≤b≤m;
2. a×b 是 2016 的倍数。
Input
输入包含不超过 30 组数据。
每组数据包含两个整数 n,m (1≤n,m≤10 9).
Output
对于每组数据,输出一个整数表示满足条件的数量。
Sample Input
32 63
2016 2016
1000000000 1000000000
Sample Output
1
30576
7523146895502644
思路:
额...一开始卡在枚举约数,统计个数上面,因为会碰到重复的值,要用容赤解决,太麻烦,导致一度卡题.........
后来仔细思考除了能用约数判断该数能不能被整除,还有一种新的方案,就是(a*b)%mod ------> ((a%mid)*(b%mod))%mod==0
即枚举余数,这种方法可以保证不出现重读的数,因为约数r是一对一的,不可能出现重复统计,
然后这边就有一个wrong点,就是r=0,你就会重复统计了。。。 数学啊 博大精深!!!!
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
int main()
{
ll a,b,ans,i,j;
while(cin>>a>>b) {
ans=0;
ans+=a/2016*b; //余数为0
ans+=b/2016*(a-a/2016);
for(i=1;i<=min(2015LL,a);i++) { //枚举余数
for(j=1;j<=min(2015LL,b);j++) {
if(i*j%2016==0) {
ans+=((a-i)/2016+1)*((b-j)/2016+1);
}
}
}
cout<<ans<<endl;
}
return 0;
}