CSU 1803 2016 (数论+思路)

xiaoxiao2021-02-28  78

思路:

我们可以将a,b分解为 a=k12016+i b=k22016+j 所以我们可以推出,使得 ab==0(mod2016) 只需 i*j == 0 (mod 2016) 所以我们只需在2016内遍历i,j即可,然后计算出第一个数有多少个i,第二个数有多少个j,相乘计入答案。这样就避免了容斥,极大的简化了思考过程。(话说一开始想容斥卡了半天。。)

AC代码:

#include <iostream> #include <cstdio> #include <algorithm> #include <string.h> #include <vector> typedef long long int lli; using namespace std; lli n,m; int vis[2017]; int main(){ while(~scanf("%lld%lld",&n,&m)){ lli ans = 0; for(int i = 1;i <= 2016;i++){ for(int j = 1;j <= 2016;j++){ if(i*j % 2016 == 0){ ans += (n/2016 + (n%2016 >= i)) * (m/2016 + (m%2016 >= j)); } } } printf("%lld\n",ans); } return 0; }
转载请注明原文地址: https://www.6miu.com/read-51995.html

最新回复(0)