给出正整数 n 和 m,统计满足以下条件的正整数对 (a, b) 的数量:
1 ≤ a ≤ n, 1 ≤ b ≤ m;
a × b 是 2016 的倍数。
输入包含不超过 30 组数据。
每组数据包含两个整数 n, m (1 ≤ n, m ≤ 109 ).
Output
对于每组数据,输出一个整数表示满足条件的数量。
Sample Input
32 63
2016 2016
1000000000 1000000000
Sample Output
1
30576
7523146895502644
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<queue>
#include<vector>
#include<map>
#include<stack>
#include<set>
using namespace std;
#define pi acos(-1.0)
#define EPS 1e-6
#define e exp(1.0); //2.718281828//log(x)
#define mod 1000000007
#define INF 0x7fffffff
#define inf 0x3f3f3f3f
#pragma comment(linker,"/STACK:102400000,102400000")
typedef long long LL;
#define debug(x) cout<<x<<" ";
#define debug2(x) cout<<x<<endl;
LL n,m;
LL cnta[2222],cntb[2222];
void geta(){
LL temp=n/2016;
LL cnt=n%2016;
cnta[0]=temp;
for(int i=1;i<=cnt;i++) cnta[i]=temp+1;
for(int i=cnt+1;i<2016;i++) cnta[i]=temp;
}
void getb(){
LL temp=m/2016;
LL cnt=m%2016;
cntb[0]=temp;
for(int i=1;i<=cnt;i++) cntb[i]=temp+1;
for(int i=cnt+1;i<2016;i++) cntb[i]=temp;
}
int main(){
while(scanf("%I64d %I64d",&n,&m)!=EOF){
geta();
getb();
LL ans=0;
for(int i=0;i<2016;i++){
for(int j=0;j<2016;j++){
if((i*j)%2016==0) ans+=cnta[i]*cntb[j];
}
}
printf("%lld\n",ans);
}
return 0;
}
/*
_ooOoo_
o8888888o
88" . "88
(| -_- |)
O\ = /O
____/`---'\____
.' \\| |// `.
/ \\||| : |||// \
/ _||||| -:- |||||- \
| | \\\ - /// | |
| \_| ''\---/'' | |
\ .-\__ `-` ___/-. /
___`. .' /--.--\ `. . __
."" '< `.___\_<|>_/___.' >'"".
| | : `- \`.;`\ _ /`;.`/ - ` : | |
\ \ `-. \_ __\ /__ _/ .-` / /
======`-.____`-.___\_____/___.-`____.-'======
`=---='
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
I have a dream!A AC deram!!
orz orz orz orz orz orz orz orz orz orz orz
orz orz orz orz orz orz orz orz orz orz orz
orz orz orz orz orz orz orz orz orz orz orz
*/