思路:(a*b)%2016实际上就是(a%2016*b%2016)%2016..根据这个性质枚举余数...开两个数组标记下当余数为i时有多少种选择,然后就可以了
#include<bits/stdc++.h>
using namespace std;
#define LL long long
int cnta[2100],cntb[2100];
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF )
{
int tmp = n/2016;
int tmp1 = n%2016;
cnta[0]=tmp;
for(int i = 1;i<=tmp1;i++)
cnta[i]=tmp+1;
for(int i=tmp1+1;i<2016;i++)
cnta[i]=tmp;
tmp = m/2016;
tmp1 = m%2016;
cntb[0]=tmp;
for(int i = 1;i<=tmp1;i++)
cntb[i]=tmp+1;
for(int i = tmp1+1;i<2016;i++)
cntb[i]=tmp;
LL ans = 0;
for(int i = 0;i<2016;i++)
for(int j = 0;j<2016;j++)
if((i*j)%2016==0)
ans+=(LL)cnta[i]*cntb[j];
printf("%lld\n",ans);
}
}
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