2016
大意就是给出m和n,求出所有的正整数对(a,b),1<=a<=m,1<=b<=n;a*b是2016的倍数;
1-2016 和 2017-4032 范围内的整数对个数相同,所以只求一个周期内即可。
typedef long long ll;
int main()
{
ll m,n;
while(scanf("%lld%lld",&m,&n)!=EOF)
{
int a=min((int)m,2016),b=min((int)n,2016);
ll cnt=0;
for(int i=1;i<=a;i++)
{
for(int j=1;j<=b;j++)
{
if(i*j%2016==0)
{
cnt+=((m-i)/2016+1)*((n-j)/2016+1);
}
}
}
printf("%lld\n",cnt);
}
return 0;
}
2018
跟2016差不多,给定a,b,c,d,求出所有整数对 (m,n)其中 a<=m<=b,c<=n<=d,满足m*n%2018==0;
求 a 到 b 范围内 m 的倍数的个数:cnt = b / m + (a - 1) / m;
注意去重
typedef long long ll;
int main()
{
ll a,b,c,d;
while(scanf("%lld%lld%lld%lld",&a,&b,&c,&d)!=EOF)
{
ll ans=0;
ll x[6]={0},y[6]={0};
x[1]=b-a+1;
y[1]=d-c+1;
x[2]=b/2-(a-1)/2;
y[2]=d/2-(c-1)/2;
x[3]=b/1009-(a-1)/1009;
y[3]=d/1009-(c-1)/1009;
x[4]=b/2018-(a-1)/2018;
y[4]=d/2018-(c-1)/2018;
x[2]-=x[4];
x[3]-=x[4];
x[1]-=(x[2]+x[3]+x[4]);
ans=x[1]*y[4]+x[2]*y[3]+x[3]*y[2]+x[4]*y[1];
printf("%lld\n",ans);
}
return 0;
}