码迷,mamicode.com
首页 > 其他好文 > 详细

2019秦皇岛补题

时间:2019-10-31 09:11:39      阅读:96      评论:0      收藏:0      [点我收藏+]

标签:链接   vector   http   ++   i++   pac   false   names   ios   

F题

链接:https://codeforces.com/gym/102361/problem/F
思路 如果环的边长为k,那么环的删边方案数是2k-1。如果链的边长为k,那么链的删边方案数是2k。环的方案数乘以链的方案数就是总的方案数
(之前没关同步T了。。。)
代码

#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring> 
using namespace std;
const int maxn=3e5+10;
const int mod=998244353;
#define ll long long 
int n,m,cnt,tot;
ll ans;
vector<int>G[maxn];
int vis[maxn],deep[maxn];
ll power(ll a,ll b)
{
    ll ans=1,x=a;
    for(;b;b>>=1)
    {
        if(b&1)
        {
            ans=ans*x%mod;
        }
        x=x*x%mod;
    }
    return ans;
}
void dfs(int u,int fa)
{   
    deep[u]=deep[fa]+1;
    for(int i=0;i<G[u].size();i++)
    {
        if(G[u][i]!=fa)
        {
            if(!vis[G[u][i]])
            {
                vis[G[u][i]]=1;
                dfs(G[u][i],u);
            }
            else if(deep[G[u][i]]<deep[u])
            {
                int x=deep[u]-deep[G[u][i]]+1;
                tot-=x;
                ans=ans*(power(2,x)-1)%mod;
            }
        }
        
    }
}
int main()
{
        int u,v;    
        ios::sync_with_stdio(false);
        cin>>n>>m;
        ans=1,tot=m;
        for(int i=1;i<=m;i++)
        {
            int u,v;
            cin>>u>>v;
            G[u].push_back(v);
            G[v].push_back(u); 
        }
        for(int i=1;i<=n;i++)
        {
            if(!vis[i])
            {
                vis[i]=1;
                dfs(i,i);
            }
        }
        ans=ans*power(2,tot)%mod;
        cout<<ans<<"\n";
    
    return 0;
}

2019秦皇岛补题

标签:链接   vector   http   ++   i++   pac   false   names   ios   

原文地址:https://www.cnblogs.com/hh13579/p/11769014.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!