给出正整数 n 和 m,统计满足以下条件的正整数对 (a,b) 的数量:
Output
Sample Input
Sample Output
Hint
1. 1≤a≤n,1≤b≤m;
2. a×b 是 2016 的倍数。
Input
输入包含不超过 30 组数据。
每组数据包含两个整数 n,m (1≤n,m≤10
9).
对于每组数据,输出一个整数表示满足条件的数量。
32 63 2016 2016 1000000000 1000000000
1 30576 7523146895502644
#include<stdio.h>
#include<string.h>
long long x[2030],y[2030];
int main()
{
long long n,m;
while(scanf("%lld%lld",&n,&m)!=EOF)
{
memset(x,0,sizeof(x));
memset(y,0,sizeof(y));
long long a,b,c,d;
long long num=0;
a=n/2016;
b=m/2016;
c=n%2016;
d=m%2016;
//x取余2016的情况
for(int i=1;i<=c;i++){
x[i]=a+1;
}
for(int i=c+1;i<=2016;i++){
x[i]=a;
}
//y取余2016的情况
for(int i=1;i<=d;i++){
y[i]=b+1;
}
for(int i=d+1;i<=2016;i++){
y[i]=b;
}
/**
*根据同余定理(a×b)%2016=((a%2016)×(b%2016))%2016
*所以只要知道1-2016的值就行了,取余的结果都是一样的
*/
for(int i=1;i<=2016;i++){
for(int j=0;j<=2016;j++){
if(i*j%2016==0)num=num+x[i]*y[j];
}
}
printf("%lld\n",num);
}
return 0;
}
#include<string.h>
long long x[2030],y[2030];
int main()
{
long long n,m;
while(scanf("%lld%lld",&n,&m)!=EOF)
{
memset(x,0,sizeof(x));
memset(y,0,sizeof(y));
long long a,b,c,d;
long long num=0;
a=n/2016;
b=m/2016;
c=n%2016;
d=m%2016;
//x取余2016的情况
for(int i=1;i<=c;i++){
x[i]=a+1;
}
for(int i=c+1;i<=2016;i++){
x[i]=a;
}
//y取余2016的情况
for(int i=1;i<=d;i++){
y[i]=b+1;
}
for(int i=d+1;i<=2016;i++){
y[i]=b;
}
/**
*根据同余定理(a×b)%2016=((a%2016)×(b%2016))%2016
*所以只要知道1-2016的值就行了,取余的结果都是一样的
*/
for(int i=1;i<=2016;i++){
for(int j=0;j<=2016;j++){
if(i*j%2016==0)num=num+x[i]*y[j];
}
}
printf("%lld\n",num);
}
return 0;
}