NOI模拟9

清北营赛制,能看见分,但是看不见名次

所以这是放假回来的第一次考试,然而考的并不好

开场看T1,兑着这题就看了一个小时,然后发现并没有什么结果,于是走了,走的彻彻底底,连暴力都没弄对

于是T2似乎切了,但是,我用的前向星建边,TLEEEE了,密集图用vector,稀疏图用前向星...

T3,魂淡题,老子就不喜欢打模拟,你小子还给我整个分类讨论大模拟,细节还贼多,你说魂淡不魂淡

T1 大天桥

多项式爆推,需要分母有理化,最后得到了答案的递推式

AC_code
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define fo(i,x,y) for(int i=(x);i<=(y);i++)
#define fu(i,x,y) for(int i=(x);i>=(y);i--)
int read(){
    int s=0,t=1;char ch=getchar();
    while(!isdigit(ch)){if(ch=='-')t=-1;ch=getchar();}
    while(isdigit(ch)){s=(s<<1)+(s<<3)+(ch^48);ch=getchar();}
    return s*t;
}
const int N=1e7+5;
int n,k,mod,ans;
int ksm(int x,int y,int mo=mod){
    int ret=1;
    while(y){
        if(y&1)ret=ret*x%mod;
        x=x*x%mod;y>>=1;
    }return ret;
}
int jc[N],inv[N];
signed main(){
    freopen("flyover.in","r",stdin);
    freopen("flyover.out","w",stdout);
    n=read()>>1;k=read();mod=read();k%=mod;
    jc[0]=1;fo(i,1,2*n)jc[i]=jc[i-1]*i%mod;
    inv[0]=1;inv[2*n]=ksm(jc[2*n],mod-2);
    fu(i,2*n-1,1)inv[i]=inv[i+1]*(i+1)%mod;
    ans=1;int now=1;
    fo(i,1,n){
        now=now*(k-1)%mod;
        ans=(ans*k%mod*k%mod-jc[2*i-2]*inv[i]%mod*inv[i-1]%mod*k%mod*now%mod+mod)%mod;
    }
    printf("%lld\n",ans);
    return 0;
}

T2 中点图

四元环和三元环计数...

AC_code
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define fo(i,x,y) for(int i=(x);i<=(y);i++)
#define fu(i,x,y) for(int i=(x);i>=(y);i--)
int read(){
    int s=0,t=1;char ch=getchar();
    while(!isdigit(ch)){if(ch=='-')t=-1;ch=getchar();}
    while(isdigit(ch)){s=(s<<1)+(s<<3)+(ch^48);ch=getchar();}
    return s*t;
}
const int N=5e5+5;
const int mod=998244353;
int T,n,m;ll ans;
struct D{int x,y;}d[N];
int du[N];vector<int> e[N],a[N];
int vis[N],cnt;
bool cmp(int x,int y){
    if(du[x]!=du[y])return du[x]<du[y];
    return x<y;
}
void find_3(){
    fo(x,1,n){
        for(int y:a[x])vis[y]=true;
        for(int y:a[x])for(int z:a[y])if(vis[z])ans+=3;
        for(int y:a[x])vis[y]=false;
    }
}
void find_4(){
    fo(x,1,n){
        for(int y:e[x])for(int z:a[y])if(cmp(x,z))ans+=vis[z]++;
        for(int y:e[x])for(int z:a[y])vis[z]=0;
    }
}
signed main(){
    freopen("graph.in","r",stdin);
    freopen("graph.out","w",stdout);
    T=read();
    while(T--){
        n=read();m=read();ans=0;
        fo(i,1,n){du[i]=0;e[i].clear();a[i].clear();}
        fo(i,1,m){
            d[i].x=read();d[i].y=read();
            du[d[i].x]++;du[d[i].y]++;
            e[d[i].x].push_back(d[i].y);
            e[d[i].y].push_back(d[i].x);
        }
        fo(i,1,m){
            if(!cmp(d[i].x,d[i].y))swap(d[i].x,d[i].y);
            a[d[i].x].push_back(d[i].y);
        }
        find_3();
        // cerr<<ans<<endl;
        find_4();
        // cerr<<ans<<endl;
        fo(i,1,n)ans+=1ll*du[i]*(du[i]-1)/2;
        ans+=1ll*(n+m-3)*m;
        printf("%lld\n",ans%mod);
    }
    return 0;
}

T3 游戏

呵呵呵,先堆到左上角,一点一点往右下挪,我是真的写崩了...

posted @ 2022-05-14 21:38  fengwu2005  阅读(49)  评论(0编辑  收藏  举报