思路:
我们可以将a,b分解为
a=k1∗2016+i
b=k2∗2016+j
所以我们可以推出,使得
a∗b==0(mod2016)
只需 i*j == 0 (mod 2016) 所以我们只需在2016内遍历i,j即可,然后计算出第一个数有多少个i,第二个数有多少个j,相乘计入答案。这样就避免了容斥,极大的简化了思考过程。(话说一开始想容斥卡了半天。。)
AC代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string.h>
#include <vector>
typedef long long int lli;
using namespace std;
lli n,m;
int vis[
2017];
int main(){
while(~
scanf(
"%lld%lld",&n,&m)){
lli ans =
0;
for(
int i =
1;i <=
2016;i++){
for(
int j =
1;j <=
2016;j++){
if(i*j %
2016 ==
0){
ans += (n/
2016 + (n%
2016 >= i)) * (m/
2016 + (m%
2016 >= j));
}
}
}
printf(
"%lld\n",ans);
}
return 0;
}
转载请注明原文地址: https://www.6miu.com/read-51995.html