给出正整数 n 和 m,统计满足以下条件的正整数对 (a,b) 的数量:
1. 1≤a≤n,1≤b≤m;
2. a×b 是 2016 的倍数。
输入包含不超过 30 组数据。
每组数据包含两个整数 n,m (1≤n,m≤10
9).
32 63 2016 2016 1000000000 1000000000
1 305767523146895502644
解题思路:可以求出在 [1,N] 中,模为 [0,2016] 的数的个数; 以及在 [1,M] 中,模为 [0,2016] 的数的个数。复杂度 O(2016)
因为 x∗y%2016=x%2016∗y%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 0x3f3f3f3f typedef 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; }