首页 > 代码库 > 湖南省第十二届大学生计算机程序设计竞赛 problem A 2016

湖南省第十二届大学生计算机程序设计竞赛 problem A 2016

如果 a * b % 2016 == 0

如果a = 1 ,且 a * b % 2016 == 0

考虑一下a = 2017的时候

2017 * b = (2016 + 1) * b % 2016 == 0必定成立

那么就是说1中搭配成的b,2017一样能搭配。

同样:4033 * b = (2016 + 2016 + 1) * b % 2016 == 0必定成立

所以,我可以枚举[1,2016]中[1,2016]中,i * j % 2016 == 0的对数,然后乘上对应的[1,n]中有i这个数的个数,代替数也算,代替数就是那些等价数,1 --- 2017 --- 4033 

技术分享
#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#include <algorithm>using namespace std;#define inf (0x3f3f3f3f)typedef long long int LL;#include <iostream>#include <sstream>#include <vector>#include <set>#include <map>#include <queue>#include <string>LL n, m;const int maxn = 2016 + 20;LL numn[maxn], numm[maxn];void work () {   LL tnk = n / 2016;   LL rn =  n % 2016;   memset (numn, 0, sizeof numn);   memset (numm, 0, sizeof numm);   for (int i = 1; i <= rn; ++i) {       numn[i] = tnk + 1;   }   for (int i = rn + 1; i <= 2016; ++i) {       numn[i] = tnk;   }   LL tmk = m / 2016;   LL rm = m % 2016;   for (int i = 1; i <= rm; ++i) {       numm[i] = tmk + 1;   }   for (int i = rm + 1; i <= 2016; ++i) {       numm[i] = tmk;   }   LL ans = 0;   for (int i = 1; i <= 2016; ++i) {       for (int j = 1; j <= 2016; ++j) {           if ((i * j) % 2016 == 0) {               ans += numn[i] * numm[j];           }       }   }   cout << ans << endl;}int main () {#ifdef local    freopen("data.txt","r",stdin);#endif    while (cin >> n >> m) {        work ();    }    return 0;}
View Code

 

湖南省第十二届大学生计算机程序设计竞赛 problem A 2016