CSU - 1803 2016 (a*b%2016的个数)

 给出正整数 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


a*b%2016==0 ,  首先要想到 (a%2016)*(b*2016)%2016 == 0


然后可以将a划分出 k*(0,2016) + (1,a%2016)  k+1个区间 ,然后就是简单的数学题了!!!!

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
ll f[2017];
int main()
{
	ios::sync_with_stdio(false);
	ll a,b,num1,num2,ans,tmp,t;
	int i,j,r1,r2;
	tmp=0;
	for(i=0;i<2016;i++) {
		for(j=0;j<2016;j++) {
			if(i*j%2016==0) tmp++;
		}
		f[i]=tmp;
	}
	while(cin>>a>>b) {
		num1=a/2016,num2=b/2016;
		r1=a%2016,r2=b%2016;
		ans=num1*num2*tmp;
		t=0;
		for(i=1;i<=r1;i++) {
			for(j=0;j<2016;j++) {
				if(i*j%2016==0) t++;
			}
		}
		ans+=f[r1]*num2,t=0;
		for(i=1;i<=r2;i++) {
			for(j=0;j<2016;j++) {
				if(i*j%2016==0) t++;
			}
		}
		ans+=f[r2]*num1,t=0;
		for(i=1;i<=r1;i++) {
			for(j=1;j<=r2;j++) {
				if(i*j%2016==0) ans++;
			}
		}
		cout<<ans<<endl;
	}
	return 0;
}








  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值