CSU 1803 2016

a,b可以表示成a=x*2016+i  b=y*2016+j;
a*b=x*y*2016^2+x*2016*j+y*2016*i+i*j;
其中除了i*j这一项,其他的项都是2016的倍数;
事先建立两个数组保存两个区间中i,j的数目
则在2016*2016中找i*j%2016=0的i,j;
将起相乘累加即可

#include<cstdio>
#define LL long long
using namespace std;
const int lin=2016;
LL a[lin],b[lin];
int main(){
	int n,m;
	while(~scanf("%d%d",&n,&m)){
		for(int i=0;i<lin;i++)a[i]=n/lin,b[i]=m/lin;
		for(int i=1;i<=n%lin;i++)a[i]++;
		for(int i=1;i<=m%lin;i++)b[i]++;
		LL ans=0;
		for(int i=0;i<lin;i++){
			for(int j=0;j<lin;j++)if(i*j%lin==0)ans+=a[i]*b[j];
		}
		printf("%lld\n",ans);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/love_phoebe/article/details/81092469
今日推荐