题目链接:B. Divide Candies
题意:
给两个整数n,m,问有多少种情况满足(i2 + j2) % m == 0 (1 <= i, j <= n);
题解:
我们将式子转化一下,变可以得到如下结果
(i2 + j2) % m = (i2 %m+ j2%m) %m = ((i % m * i % m) + (j % m * j % m)) % m
如此我们就只需要统计余数0~m-1有多少个即可,用cnt数组存储个数
然后枚举余数i,j,计算答案
int cnt[N];
int main()
{
int n, m; scanf("%d%d", &n, &m);
//统计余数的个数
for (int i = 0; i < m; i ++ ) cnt[i] = n / m;
//对余下的数单独统计
for (int i = n; i > n - n % m; i -- ) cnt[i % m] ++;
LL ans = 0;
//枚举余数
for (int i = 0; i < m; i ++ )
{
for (int j = 0; j < m; j ++ )
{
if ((i * i + j * j) % m == 0)
ans += 1ll * cnt[i] * cnt[j];
}
}
printf("%lld\n", ans);
return 0;
}