按每一位都有算的话,1^2+2^2+k^2
0的地方就是质因子的组合
容斥一下
2和6
2^2+4^2+6^2=2^2*(1^2+2^2+3^2)
代码如下
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int mod=998244353;
int t,pri[30],pn,k;
int q_pow(int a,int b)
{
long long ans=1,base=a;
while(b) {
if(b&1) ans=(1ll*ans*base)%mod;
base=(1ll*base*base)%mod;
b>>=1;
}
return ans;
}
long long sum(int n)
{
long long ans=n;
ans=(ans*(n+1))%mod;
ans=(ans*(2*n+1))%mod;
ans=(ans*(q_pow(6,mod-2)))%mod;;
return ans;
}
long long solve(int n)
{
long long res=0;
for(int i=1;i<(1<<pn);i++) {
long long temp=1;int cnt=0;
for(int j=0;j<pn;j++) {
if((i>>j)&1) {
cnt++;
temp*=pri[j];
}
}
long long ans=(temp*temp)%mod;
ans=(ans*sum(n/temp))%mod;
// printf("temp==%lld ans==%lld\n",temp,ans);
if(cnt&1) res=(res+ans)%mod;
else res=(res-ans+mod)%mod;
}
return res;
}
int main()
{
scanf("%d",&t);
while(t--) {
scanf("%d",&k);
long long ans=sum(k);
pn=0;
int temp=k;
for(int i=2;i*i<=temp;i++) {
if(temp%i) continue;
while(temp%i==0) {
temp/=i;
}
pri[pn++]=i;
}
if(temp>1) {
pri[pn++]=temp;
}
ans=(ans-solve(k)+mod)%mod;
printf("%lld\n",ans);
}
}