题目大意
题解
由题意得
x ⊗ y = 2 x y g c d ( x , y ) 2 x⊗y=\frac{2xy}{gcd(x,y)^2} x⊗y=gcd(x,y)22xy
所以
b i = ∑ 1 ≤ j , k ≤ n , j k g c d ( j , k ) 2 = i a j k c b_i= \sum\limits_{1≤j,k≤n,\frac{jk}{gcd(j,k)^2}=i}a_j k^c bi=1≤j,k≤n,gcd(j,k)2jk=i∑ajkc
设
g
=
g
c
d
(
j
,
k
)
,
x
=
j
g
,
y
=
k
g
g=gcd(j,k),x=\frac{j}{g},y=\frac{k}{g}
g=gcd(j,k),x=gj,y=gk
化简可得
b i = y c ∑ 1 ≤ x , y ≤ n , x y = i , g c d ( x , y ) = 1 ∑ g = 1 m i n ( n x , n x ) a x g g c b_i=y^c\sum\limits_{1≤x,y≤n,xy=i,gcd(x,y)=1} \sum\limits_{g=1}^{min(\frac{n}{x},\frac{n}{x})}a_{xg}g^c bi=yc1≤x,y≤n,xy=i,gcd(x,y)=1∑g=1∑min(xn,xn)axggc
code
#include<bits/stdc++.h>
using namespace std;
const long long mod=998244353;
long long ksm(long long x,long long y){
long long res=1;
while(y)
{
if(y&1) res=res*x%mod;
x=x*x%mod;
y>>=1;
}
return res;
}
int n,c;
int a[1000010];
long long powc[1000010],sum[1000010],b[1000010];
int main()
{
int i,j;
scanf("%d%d",&n,&c);
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
powc[i]=ksm(i,c);
}
for(i=1;i<=n;i++)
{
int mx=n/i;
for(j=1;j<=mx;j++)
sum[j]=(sum[j-1]+a[i*j]*powc[j])%mod;
for(j=1;j<=mx;j++)
{
if(__gcd(i,j)>1) continue;
b[i*j]=(b[i*j]+powc[j]*sum[min(mx,n/j)])%mod;
}
}
for(i=1;i<=n;i++)
b[i]^=b[i-1];
printf("%lld\n",b[n]);
return 0;
}