ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【ybtoj】【矩阵快速幂】公式推导

2021-09-27 08:33:41  阅读:177  来源: 互联网

标签:推导 2s read ybtoj ll nd 矩阵 mod


题意

image

题解

被思维定式坑了...
一开始想的都是怎么用矩阵转移。

  • 等差数列很好转移,矩阵里一个 \(1\) 一个 \(d\) 即可。
  • 组合数不好转移,只能想到 \(C_n^m=C_n^{m-1} \times \frac{n-m+1}{m}\) ,然而由于 \(m\) 是不断变化的,而且矩阵不好维护除法的形式,思考无果。
    实际上是快速幂的纯数学推导...
    由于 \(C_n^k=C_n^{n-k}\) ,且这两项的 \(a\) 值和正好是 \(2s+nd\) ,所以可以把 \(a\) 对应的系数提出来,变成\(\frac{1}{2}(2s+nd) \sum \limits_{i=0}^n C_n^i\) ,根据二项式定理可得\(\sum \limits_{i=0}^n C_n^i=2^n\) ,那么原式就变成了\((2s+nd)\times 2^n\) ,直接快速幂求出即可。

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int INF = 0x3f3f3f3f,mod = 998244353;
inline ll read()
{
	ll ret=0;char ch=' ',c=getchar();
	while(!(c>='0'&&c<='9')) ch=c,c=getchar();
	while(c>='0'&&c<='9') ret=(ret<<1)+(ret<<3)+c-'0',c=getchar();
	return ch=='-'?-ret:ret;
}
ll qpow(ll x,ll y)
{
	ll ret=1;
	while(y)
	{
		if(y&1) ret=ret*x%mod;
		x=x*x%mod;
		y>>=1;
	}
	return ret;
}
ll n,s,d;
int main()
{
	n=read(),s=read(),d=read();
	d%=mod,s%=mod;
	ll ans=((s<<1)+n%mod*d%mod)%mod;
	ans=(ans*qpow(2,n-1))%mod;
	printf("%lld",ans);
	return 0;
}

标签:推导,2s,read,ybtoj,ll,nd,矩阵,mod
来源: https://www.cnblogs.com/conprour/p/15341318.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有