给出正整数 n 和 m,统计满足以下条件的正整数对 (a,b) 的数量:
1. 1≤a≤n,1≤b≤m;
2. a×b 是 2016 的倍数。
输入包含不超过 30 组数据。
每组数据包含两个整数 n,m (1≤n,m≤10
9).
对于每组数据,输出一个整数表示满足条件的数量。
32 63
2016 2016
1000000000 1000000000
1
30576
7523146895502644
a*b%2016==0 , 首先要想到 (a%2016)*(b*2016)%2016 == 0
然后可以将a划分出 k*(0,2016) + (1,a%2016) k+1个区间 ,然后就是简单的数学题了!!!!
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
ll f[2017];
int main()
{
ios::sync_with_stdio(false);
ll a,b,num1,num2,ans,tmp,t;
int i,j,r1,r2;
tmp=0;
for(i=0;i<2016;i++) {
for(j=0;j<2016;j++) {
if(i*j%2016==0) tmp++;
}
f[i]=tmp;
}
while(cin>>a>>b) {
num1=a/2016,num2=b/2016;
r1=a%2016,r2=b%2016;
ans=num1*num2*tmp;
t=0;
for(i=1;i<=r1;i++) {
for(j=0;j<2016;j++) {
if(i*j%2016==0) t++;
}
}
ans+=f[r1]*num2,t=0;
for(i=1;i<=r2;i++) {
for(j=0;j<2016;j++) {
if(i*j%2016==0) t++;
}
}
ans+=f[r2]*num1,t=0;
for(i=1;i<=r1;i++) {
for(j=1;j<=r2;j++) {
if(i*j%2016==0) ans++;
}
}
cout<<ans<<endl;
}
return 0;
}