传送门
题目大意
题解
由题意得
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∑?aj?kc
设
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?)?axg?gc
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;
}
|