其他分享
首页 > 其他分享> > 来自学长的馈赠2

来自学长的馈赠2

作者:互联网

T1.随

考虑到一种错误的做法 求一次期望的m次方

问题在于双模数 导致了分数直接取模造成的数值丢失

所以考虑维护每个剩余系的数的个数

可以想到用矩阵快速幂维护

复杂度$mod^3\log{m}$

发现矩阵快速幂会无用的遍历很多次

考虑仔细魔改一个快速幂

两个数组互相滚

复杂度$mod^2\log{m}$

#include<bits/stdc++.h>
#define Re register int
#define Sa Sakura
#define _ putchar(' ')
#define el putchar('\n')
#define maxn 1010
#define int long long
#define Mod 1000000007

using namespace std;

inline int read(){
    int x=0,f=0,c=getchar();
    while(!isdigit(c)) f|=c=='-',c=getchar();
    while(isdigit(c)) x=(x<<1)+(x<<3)+(c^48),c=getchar();
    return f?-x:x;
} 

inline void ot(int x){
    if(x<0) putchar('-'),x=-x;
    if(x>9) ot(x/10);putchar(x%10|48);
}

int n,m,mod,ans1,ans2;
int cnt[2][maxn],now,anscnt[maxn],pre[maxn];

inline void mul(){
    for(Re i=0;i<mod;i++) cnt[now][i]=0;
    for(Re i=0;i<mod;i++)
        for(Re j=0;j<mod;j++)
            cnt[now][i*j%mod]=(cnt[now][i*j%mod]+cnt[now^1][i]*cnt[now^1][j]%Mod)%Mod;
//    ot(777);for(Re i=0;i<mod;i++) ot(cnt[now][i]),_;el;
}

inline void mulans(){
    for(Re i=0;i<mod;i++) pre[i]=anscnt[i],anscnt[i]=0;
    for(Re i=0;i<mod;i++) 
        for(Re j=0;j<mod;j++)
            anscnt[i*j%mod]+=pre[i]*cnt[now][j]%Mod,anscnt[i*j%mod]%=Mod;
//    for(Re i=0;i<mod;i++) ot(anscnt[i]),_;el;
}

void expow(){
    int d=m;
    while(d){
        if(d&1) mulans();
        now^=1;
        mul();
        d>>=1;
    }
}

inline int qpow(int x,int d=Mod-2){
    int an=1;
    while(d){
        if(d&1) an=an*x%Mod;
        x=x*x%Mod;
        d>>=1;
    }
    return an;
}

main(){
    n=read(),m=read(),mod=read();
    for(Re i=1;i<=n;i++) cnt[now][read()%mod]++;
    anscnt[1]=1;
    expow();
    for(Re i=1;i<mod;i++) ans1+=anscnt[i]*i,ans1%=Mod;
    ans2=qpow(n,m);
    ans1=ans1*qpow(ans2)%Mod;
    ot(ans1);
}
View Code

 

T2.单

二次扫描加换跟

对于opt0:

暴力求出点1的b 再dfs转移

设以一个点x为根的子树和为sum(x)

则b[fa]-sum(x)+(sum(1)-sum(x))=b[x]

对于opt1:

如果将其视为无根树 对于没一个点x都$\sum_{b[v}-b[x]}$

标签:来自,int,sum,学长,read,mod,馈赠,Mod,define
来源: https://www.cnblogs.com/Sakura-Lu/p/16504276.html