2016

来源:互联网 发布:nginx pathinfo 404 编辑:程序博客网 时间:2024/06/10 03:57
 给出正整数 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
130576

7523146895502644

解题思路:可以求出在[1,N]中,模为[0,2016]的数的个数; 以及在[1,M]中,模为[0,2016]的数的个数。复杂度O(2016) 
因为xy%2016=x%2016y%2016,那么,接下来就只需要统计求和就OK了。

要求两个数的乘积是2016的倍数,那么只需他们对2016的模是2016的倍数即可。所以1 和 2017 在这个问题中其实是相同的,而全部化成对2016的模,方便计数。

可以用两层循环进行求解,因为所给时间很充足。

#include <iostream>#include <cstdio>#include <map>#include <set>#include <vector>#include <queue>#include <stack>#include <cmath>#include <algorithm>#include <cstring>#include <string>using namespace std;#define INF 0x3f3f3f3ftypedef long long LL;LL a[2016],b[2016];int main(){    LL n,m,sum;    while(cin>>n>>m)    {        sum=0;        for(int i=0; i<2016; i++)        {            a[i]=n/2016;            b[i]=m/2016;        }        for(int i=1; i<=n%2016; i++)        {            a[i]++;        }        for(int i=1; i<=m%2016; i++)        {            b[i]++;        }        for(int i=0; i<2016; i++)        {            for(int j=0; j<2016; j++)            {                if((i*j)%2016==0)                {                    sum+=a[i]*b[j];                }            }        }        cout<<sum<<endl;    }    return 0;}


0 0