zoukankan      html  css  js  c++  java
  • 四连测Day3

    题解和题目看这里

    #include<bits/stdc++.h>
    using namespace std;
    int T;
    int n,m;
    int fa[100010];
    int d[100010];
    int cnt;
    int cnt2;
    int fnd(int x) {return fa[x]==x?x:fa[x]=fnd(fa[x]);}
    void merg(int a,int b)
    {
        a=fnd(a);b=fnd(b);
        if(a==b) return;
        cnt--;
        fa[b]=a;
    }
    int main()
    {
        freopen("euler.in","r",stdin);
        freopen("euler.out","w",stdout);
        scanf("%d",&T);
        while(T--)
        {
            scanf("%d%d",&n,&m);
            for(int i=1;i<=n;i++) fa[i]=i;
            cnt=n;cnt2=0;
            for(int i=1;i<=m;i++)
            {
                int u,v;
                scanf("%d%d",&u,&v);
                merg(u,v);    
                d[u]++;d[v]++;
            }
            for(int i=1;i<=n;i++) if(d[i]&1) cnt2++,d[i]=0;
            if(cnt!=1||cnt2>2) printf("NO
    ");
            else printf("YES
    ");     
        }
    }
    euler
    //复仇者联盟不是一个人,所以有s
    #include<bits/stdc++.h>
    #define mod 998244353
    #define inv 499122177
    #define ll long long
    #define lowbit(x) (x&-x)
    using namespace std;
    ll dp[35][100010];
    int n,m;
    ll wih[100010][6];
    int k;
    ll ans[6];
    int cont(int x)
    {
        int c=0;
        while(x)
        {
            x-=lowbit(x);
            c++;
        }
        return c;
    }
    int main()
    {
        freopen("avengers3.in","r",stdin);
        freopen("avengers3.out","w",stdout);    
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&k);
            int t;
            for(int j=1;j<=k;j++)
            {
                scanf("%d",&t);
                wih[t][i]=1;
            }
        }
        dp[(1<<n)-1][0]=1;
        int t1;
        for(int i=0;i<m;i++)
        {
            for(int j=(1<<n)-1;j>=0;j--)
            {
                if(dp[j][i]==0) continue;
                dp[j][i+1]+=(dp[j][i]*inv)%mod;
                dp[j][i+1]%=mod;
                t1=(1<<n)-1;
                for(int ii=1;ii<=n;ii++)
                {
                    if(wih[i+1][ii])t1-=1<<(ii-1);
                }
                dp[j&t1][i+1]+=(dp[j][i]*inv)%mod;
                dp[j&t1][i+1]%=mod;
            }
        }
        for(int i=0;i<=(1<<n)-1;i++)
        {
            (ans[cont(i)]+=dp[i][m])%=mod;
        }
        for(int i=0;i<=n;i++) printf("%d ",ans[i]);
    }
    avengers3
    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstdlib>
    #include<cmath>
    #include<cstring>
    #define mod 998244353
    #define ll long long
    ll m;
    using namespace std;
    struct mat  
    {  
        ll a[60][60];
        mat operator*(const mat &y)const
        {
            mat res;
            memset(res.a,0,sizeof(res.a));  
            for(ll i=0;i<m;i++)  
                for(ll j=0;j<m;j++)  
                    for(ll k=0;k<m;k++)  
                    {  
                        res.a[i][j]+=a[i][k]*y.a[k][j];  
                        res.a[i][j]%=mod;
                    }  
            return res;  
        }
    }a,b;  
    void mul(ll a[60][60],ll b[60][60],ll ans[60][60])
    {
        ll tmp[60][60];
        for(ll i=0;i<m;i++)
            for(ll j=0;j<m;j++)
            {
                tmp[i][j]=0;
                for(ll k=0;k<m;k++)
                    tmp[i][j]=(tmp[i][j]+a[i][k]*b[k][j])%mod;
            }
        for(ll i=0;i<m;i++)
            for(ll j=0;j<m;j++)
                ans[i][j]=tmp[i][j];
    }
    ll sum;
    char ch[60];
    ll nxt[60];
    char n[100010];
    ll nl;
    mat getmat(mat a)
    {
        mat c=a;
        for(int i=1;i<=9;i++) c=c*a;
        return c;
    }
    int main()
    {
        freopen("string.in","r",stdin);
        freopen("string.out","w",stdout);
        scanf("%s",n+1);
        nl=strlen(n+1);
        scanf("%s",ch+1);
        m=strlen(ch+1);
        ll j=0;
        for(ll i=2;i<=m;i++)
        {
            for(;j>0 && ch[j+1]!=ch[i];j=nxt[j]);
            if(ch[j+1]==ch[i])j++;
            nxt[i]=j;
        }
        for(ll i=0;i<m;i++)
           for(ll j=0;j<=25;j++)
           {
                ll t=i;
                for(;t>0&&ch[t+1]-'a'!=j;t=nxt[t]);
                if(ch[t+1]-'a'==j)t++;
                if(t!=m)b.a[t][i]=(b.a[t][i]+1)%mod;
           }
        for(ll i=0;i<m;i++)a.a[i][i]=1; 
        while(nl>0)
        {
            for(int i=1;i<=n[nl]-'0';i++) a=a*b;
            b=getmat(b);
            nl--;
        }
        for(ll i=0;i<m;i++)(sum+=a.a[i][0])%=mod;
        printf("%d",sum);
        return 0;
    }
    string(10进制快速幂版)

     明天好虚。。。

  • 相关阅读:
    POJ 2029 (二维树状数组)题解
    HDU 4819 Mosaic (二维线段树&区间最值)题解
    HDU 1823 Luck and Love (二维线段树&区间最值)题解
    POJ1061 青蛙的约会(扩展欧几里得)题解
    POJ 2155 Matrix (二维树状数组)题解
    POJ 1751 Highways(最小生成树&Prim)题解
    HDU 6148 Valley Numer (数位DP)题解
    HDU3652 B-number(数位DP)题解
    HDU 4734 (数位DP)题解
    HDU 2089 不要62 (数位DP)题解
  • 原文地址:https://www.cnblogs.com/wjxgy/p/9449354.html
Copyright © 2011-2022 走看看