Let life be beautiful |

Ginger_he

园龄:3年1个月粉丝:5关注:5

洛谷P8110题解

本文同步更新于洛谷博客

题目描述

给定两个长度为 n 的序列 {an},{bn} 与一个整数 k
设矩阵 A 满足 Aij=ai×bj,求 Ak 的所有元素的和在模 998244353 意义下的结果。

题解

k=0 的时直接输出 n,下面只讨论 k>0 的情况)
比赛的时候打了个暴力把 A2A3 都求出来了,观察发现答案为 ai×bi×(aibi)k1,现在用数学归纳法来证明一下。
Ak1 为矩阵 BAk 为矩阵 C
m=1 时,由矩阵乘法的定义可算出矩阵 A,不难发现和为 ai×bi
不妨假设 m=k1 时,Bij=ai×bi×(aibi)k2
m=k 时,如下图可得 Cij=Bijaibj,则 Cij=Bij×aibi=ai×bi×(aibi)k1,证毕。

[a1b1a1b2...a1bna2b1a2b2...a2bn............anb1anb2...anbn][B11B12...B1nB21B22...B2n............Bn1Bn2...Bnn]

最后用快速幂求解即可。

注意

{an}{bn} 中可能会有负数,注意取模。

Code

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll p=998244353;
const int maxn=1e5+5;
int n;
ll k,a[maxn],b[maxn],x,y,s;
ll quickpow(ll a,ll b)
{
    ll res=1;
    while(b)
    {
	if(b&1)
	    res=res*a%p;
	b>>=1;
	a=a*a%p;
    }
    return res;
}
int main()
{
    scanf("%d%lld",&n,&k);
    if(!k)
    {
	printf("%d\n",n);
	return 0;
    }
    for(int i=1;i<=n;i++)
    {
	scanf("%lld",&a[i]);
	x=(x+a[i])%p;
    }
    for(int i=1;i<=n;i++)
    {
        scanf("%lld",&b[i]);
	y=(y+b[i])%p;
    }
    for(int i=1;i<=n;i++)
	s=(s+a[i]*b[i]%p)%p;
    printf("%lld\n",(x*y%p*quickpow(s,k-1)%p+p)%p);
    return 0;
}

本文作者:Ginger_he

本文链接:https://www.cnblogs.com/Gingerhe/p/15864536.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Ginger_he  阅读(38)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起