题意
给定x在区间 1,n ,y在区间 1,m
求 满足x*y是2016倍数 的个数
题解
- x = p*2016+i
- y = q*2016+j
- xy = p2016q2016+p2016j+q2016i+ i*j
- 也就是说xy要是2016倍数的话, 只需要保证 ij 是2016倍数
- 那么 累加 双重循环枚举一下满足ij是2016倍数的时候 (a+1)(b+1) 即可
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main ( ) {
ll n, m;
while ( cin >> n >> m ) {
ll nn = min( 1ll*2016, n ), mm = min( 1ll*2016, m );
ll ans = 0;
for ( int i = 1; i <= nn; i++ ) {
for ( int j = 1; j <= mm; j++ ) {
if ( (i*j)%2016 == 0 ) {
ans += ((n-i)/2016 + 1)*((m-j)/2016 + 1);
// cout << i << " " << j << endl;
}
}
}
cout << ans << endl;
}
return 0;
}
// 给定x在区间 1,n ,y在区间 1,m
// 求 满足x*y是2016倍数 的个数
// 32 63
// 2016 2016
// 1000000000 1000000000
// 1
// 30576
// 7523146895502644
/**
* x = p*2016+i
* y = q*2016+j
* x*y = p*2016*q*2016+p*2016*j+q*2016*i+ i*j
* 也就是说x*y要是2016倍数的话, 只需要保证 i*j 是2016倍数
* 那么 累加 双重循环枚举一下满足i*j是2016倍数的时候 (a+1)*(b+1) 即可
*/