Beautiful Mirrors

CF1265E Beautiful Mirrors

思路:

一道期望的题,不难得出下式:

\[f_i=(1-p\%)f_1+p\%f_{i+1}+1 \]

极为暴力的思路就是\(gauss\)消元,时间复杂度\(O(n^3)\)显然过不了。但我们发现最后要求的只有\(f_1\),所以可以手算消元😉
将等号左边的式子移到右边,易得矩阵如下

\[\left[ \begin{matrix} -p_1\%&p_1\%&0&\cdots&1\\ 1-p_2\%&-1&p_2\%&\cdots&1\\ 1-p_3\%&0&-1&\cdots&1\\ \vdots&\vdots&\vdots&\ddots&\vdots\\ 0&0&0&\cdots&1 \end{matrix}\right] \]

第一行+(p1%)第二行+(p1%p2%)第三行+...便把除了\(f_1\)和常数的所有项消去了

\(\mathfrak{Talk\ is\ cheap,show\ you\ the\ code.}\)

#include<bits/stdc++.h>
using namespace std;
# define read read1<int>()
# define ll long long 
# define ull unsigned ll
# define Type template<typename T>
Type inline const T read1(){
    T m=0;
    char k=getchar();
    while(('0'>k||k>'9')&&(k!='-'))k=getchar();
    const bool f=(k=='-'?1:0);
    if(f)k=getchar();
    while('0'<=k&&k<='9')m=(m<<3)+(m<<1)+(k^48),k=getchar();
    return f?-m:m;
}
# define mod 998244353ll
ll p2(ll x){return x*x%mod;}
ll qkpow(ll n,ll m){
    return m?m&1?p2(qkpow(n,m>>1))*n%mod:p2(qkpow(n,m>>1)):1;
}
struct A{
    ll x,y;
    A(ll u=0,ll v=0){x=u,y=v;}
    A operator +(A b){
        return A((x*b.y+y*b.x)%mod,y*b.y%mod);
    }
    A operator -(){return A(mod-x,y);}
    A operator -(A b){
        return *this+(-b);
    }
    A operator *(A b){
        return A(x*b.x%mod,y*b.y%mod);
    }
    A operator /(A b){
        return *this*A(b.y,b.x);
    }
    ll operator ~(){return x*qkpow(y,mod-2)%mod;}
};
int main(){
    // cout<<qkpow(2,10);
    int s=read;
    ll p;
    A tem(1,1),t(mod-(p=read),100),tm(p,100);
    for(int i=2;i<=s;++i){
        p=read;
        tem=tem+tm;
        t=t+A(100-p,100)*tm;
        tm=tm*A(p,100);
    }
    printf("%lld",mod-~(tem/t));
    // puts("---");
	return 0;
}
posted @ 2020-10-04 22:18  ファイナル  阅读(97)  评论(0)    收藏  举报