2021牛客暑期多校训练营4 H-Convolution

这篇博客详细解析了一道数学竞赛题目,涉及到矩阵快速幂和欧几里得算法的应用。通过变换公式,将原问题转化为求解特定条件下gcd的和,进而利用矩阵快速幂进行高效计算。博主给出了清晰的思路和简洁的代码实现,对于提升数竞解题能力和算法理解具有指导意义。
摘要由CSDN通过智能技术生成

传送门

题目大意

题解

由题意得

x ⊗ y = 2 x y g c d ( x , y ) 2 x⊗y=\frac{2xy}{gcd(x,y)^2} xy=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=1j,kn,gcd(j,k)2jk=iajkc

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=yc1x,yn,xy=i,gcd(x,y)=1g=1min(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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值