四连测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\n");
        else printf("YES\n");     
    }
}
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进制快速幂版)

 明天好虚。。。

posted @ 2018-08-09 15:40  秦こころ酱  阅读(99)  评论(0编辑  收藏  举报