题解上有同余定理的解法,我一开始没想到这个解法
思路:
首先对每一个1 到 2016 的数字求与 2016 的最大公约数,用2016除以与当前数字的GCD得到一个2016的约数,对于1 到 2016中只有一个数乘以前面的数字能等于 2016,根据同余定理可以知道,大于2016 的数字里面 %2016的值和前面一样的都符合要求,以此考虑有多少个同余的数即可
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n, m;
ll GCD[2020];
ll gcd(ll a, ll b){
return b == 0 ? a : gcd(b, a % b);
}
void pre_work(){
for (int i = 1; i <= 2016; i++){
GCD[i] = gcd(i, 2016);
}
}
ll cal(ll M, ll num){
return M / num;
}
int main()
{
// freopen("in.txt", "r", stdin);
// freopen("test.txt", "w", stdout);
pre_work();
while (~scanf("%lld %lld", &n, &m)){
ll res = 0;
ll temp = n / 2016;
for (int i = 1; i <= min((ll)2016, n); i++){
if(n % 2016 >= i)res += cal(m, 2016 / GCD[i]) * (temp + 1);
else res += cal(m, 2016 / GCD[i]) * temp;
}
printf("%lld\n", res);
}
return 0;
}