zoukankan      html  css  js  c++  java
  • 【ybtoj】【矩阵快速幂】公式推导

    题意

    image

    题解

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

    • 等差数列很好转移,矩阵里一个 (1) 一个 (d) 即可。
    • 组合数不好转移,只能想到 (C_n^m=C_n^{m-1} imes 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) imes 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;
    }
    
  • 相关阅读:
    git中文输入显示问题
    how to write a DLL/SO in C/C++ for Python
    python,ctypes
    vc++,dll,lib文件百科
    c++ singleton
    build python on windows
    web前端后端
    动态链接库*.so的编译与使用
    qt,ui,QUiLoader
    qt,script
  • 原文地址:https://www.cnblogs.com/conprour/p/15341318.html
Copyright © 2011-2022 走看看