A

来源:互联网 发布:mac版word删除空白页 编辑:程序博客网 时间:2024/05/29 10:55
 给出正整数 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 632016 20161000000000 1000000000
Sample Output
1305767523146895502644
Hint

#include<stdio.h>
#include<string.h>
long long x[2030],y[2030];
int main()
{
    long long n,m;
    while(scanf("%lld%lld",&n,&m)!=EOF)
    {
        memset(x,0,sizeof(x));
        memset(y,0,sizeof(y));
        long long a,b,c,d;
        long long num=0;
        a=n/2016;
        b=m/2016;
        c=n%2016;
        d=m%2016;
        //x取余2016的情况
        for(int i=1;i<=c;i++){
            x[i]=a+1;
        }
        for(int i=c+1;i<=2016;i++){
            x[i]=a;
        }
        //y取余2016的情况
        for(int i=1;i<=d;i++){
            y[i]=b+1;
        }
        for(int i=d+1;i<=2016;i++){
            y[i]=b;
        }
        /**
        *根据同余定理(a×b)%2016=((a%2016)×(b%2016))%2016
        *所以只要知道1-2016的值就行了,取余的结果都是一样的
        */
        for(int i=1;i<=2016;i++){
            for(int j=0;j<=2016;j++){
                if(i*j%2016==0)num=num+x[i]*y[j];
            }
        }
        printf("%lld\n",num);
    }
    return 0;
}
原创粉丝点击