CSU Problem 1803 2016(同余定理)——湖南省第十二届大学生计算机程序设计竞赛

来源:互联网 发布:淘宝刷好评句子 编辑:程序博客网 时间:2024/05/22 03:16

此文章可以使用目录功能哟↑(点击上方[+])

 CSU Problem 1803 2016

Accept: 0    Submit: 0
Time Limit: 5 Sec    Memory Limit : 128 MB

 Problem Description

给出正整数 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 63
2016 2016
1000000000 1000000000

 Sample Output

1
30576
7523146895502644

 Hint


 Problem Idea

解题思路:

【题意】
求a×b是2016的倍数的正整数对(a,b)的数量

其中a∈[1,n],b∈[1,m]


【类型】
同余定理

【分析】

真心被自己蠢哭

硬是被一道水题卡了好久,不知道怎么去处理重复计算的问题

结果正解压根就不需要考虑

由同余定理得



这样,我们就可以将数据范围控制在2016以内

即记录[1,n]内 mod 2016 = i的个数a[i]

以及[1,m]内 mod 2016 = i的个数b[i]

这一步的时间复杂度为O(2016)

这样,我们只要将i*j%2016==0的所有情况a[i]*b[j]统计求和就可以了

【时间复杂度&&优化】
O(2016×2016)

题目链接→CSU Problem 1803 2016

 Source Code

/*Sherlock and Watson and Adler*/#pragma comment(linker, "/STACK:1024000000,1024000000")#include<stdio.h>#include<string.h>#include<stdlib.h>#include<queue>#include<stack>#include<math.h>#include<vector>#include<map>#include<set>#include<bitset>#include<cmath>#include<complex>#include<string>#include<algorithm>#include<iostream>#define eps 1e-9#define LL long long#define PI acos(-1.0)#define bitnum(a) __builtin_popcount(a)using namespace std;const int N = 2016;const int M = 2005;const int inf = 1000000007;const int mod = 1000003;LL a[N],b[N];int main(){    int n,m,i,j;    LL ans;    while(~scanf("%d%d",&n,&m))    {        ans=0;        for(i=0;i<N;i++)            a[i]=n/N,b[i]=m/N;        for(i=1;i<=n%N;i++)            a[i]++;        for(i=1;i<=m%N;i++)            b[i]++;        for(i=0;i<N;i++)            for(j=0;j<N;j++)                if(i*j%N==0)                    ans+=a[i]*b[j];        printf("%lld\n",ans);    }    return 0;}

菜鸟成长记
0 0