csu 1803(2016)

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int maxn=3000;
 5 
 6 /*
 7    n m <=1e9
 8    a*b=2016p  (0<a<=n  0<b<=m)
 9    的组合有多少个
10    那么也就是a*b%2016=0%2016
11    
12    那么只要枚举2016*2016个就好了
13 */
14 
15 ll cnt1[maxn],cnt2[maxn];
16 
17 void solve(int n,ll c[]){
18     int a=n/2016,b=n%2016;
19     for(int i=1;i<=b;i++)c[i]=a+1;
20     for(int i=b+1;i<=2016;i++)c[i]=a;
21 }
22 
23 int main(){
24     ll n,m;
25     
26     while(cin>>n>>m){
27     
28         solve(n,cnt1);
29         solve(m,cnt2);
30         
31         ll res=0;
32         
33         for(int i=1;i<=2016;i++)for(int j=1;j<=2016;j++)
34             if((i*j%2016)==0){
35                 res+=cnt1[i]*cnt2[j];
36             }
37         cout<<res<<endl;
38     }
39     return 0;
40 }
原文地址:https://www.cnblogs.com/jihe/p/6677893.html