2022牛客暑期第十场个人题解

H

签到,只是组合数取模需要注意一下

#include <bits/stdc++.h>
using namespace std ;
#define ull unsigned long long 
#define ll long long 
#define endl '\n'
#define int long long

const int N = 2*1000005;
const int mod = 998244353;

int t,n,q;
int x,y;
int j[N],invj[N];
int c[N];
int ans = 0;

ll powmod(ll aa, ll bb) {
    ll ret = 1;
    for (; bb; bb >>= 1) {
        if (bb & 1) ret = ret * aa % mod;
        aa = aa * aa % mod;
    }
    return ret;
}

void je() {
	j[0] = 1;
	j[1] = 1;
	for(int i=1;i<N;i++) {
		j[i] = j[i-1] * i % mod;
	}
	invj[N-1] = powmod(j[N-1],mod-2);
	for(int i=N-2;i>=1;i-- ) {
		invj[i] = (invj[i+1] * (i+1ll) % mod);
	}
}  

void init()
{
    j[0] = 1;
    j[1] = 1;
    for(int i = 1 ; i < N ;i ++ )
    {
        j[i] = j[i - 1] * i % mod;
    }
    invj[N - 1] = powmod(j[N - 1], mod - 2);
    for (int i = N - 2; i >= 1; i -- ) 
    invj[i] = (invj[i + 1] * (i + 1ll) % mod);
}

int calc(int x,int y) {
	if(x==0 ) return 1;
	if(y==x) return 1;
	if(x>y) return 0;
	return j[y] * invj[x] % mod *invj[y-x] % mod;
}	

int cac(int a ,int b)
{
    if (a < b) return 0;
    if(b == 0) return 1;
    if(a == b) return 1;
    return j[a] * invj[b] % mod * invj[a - b] % mod;
}

int a7[10],b7[10];

void solve() {
	//init(); 
	je();
	for(int i=1;i<=8;i++) {
		cin>>a7[i];
	}
	for(int i=1;i<=8;i++) {
		cin>>b7[i];
	}	
	x = (a7[1]+9) / 10;
	y = (b7[1]+9) / 10;
	for(int i=0;i<x;i++) {
		ans = (ans + calc(i,i+y-1) % mod * powmod(powmod(2,i+y)%mod,mod-2)%mod ) % mod;
	} 	 
	cout<<ans<<endl; 	
}

signed main () {
	ios::sync_with_stdio(false) ,cin.tie(0);
	t=1;
	while (t--) {
		solve();
	}
}

F

记录终点倒着寻找能够抵达的点

#include<bits/stdc++.h>
 
#define int long long
using namespace std;
 
vector<int> v[105];
int sets[105];
queue<int> q;
int paths[105];
int n, m, s, t;
 
void bfs() {
    q.push(t);
    sets[t] = 1;
    while (q.size()) {
        int cur = q.front();
        q.pop();
        for (int to: v[cur]) {
            if (sets[to]) continue;
            paths[to]++;
            if (paths[to] >= 2) {
                sets[to] = 1;
                q.push(to);
            }
        }
    }
}
 
signed main() {
    int a;
    cin >> a;
 
    int x, y;
    while (a--) {
        cin >> n >> m >> s >> t;
        for (int i = 1; i <= n; i++) {
            paths[i] = 0;
            sets[i] = 0;
            v[i].clear();
        }
        for (int i = 1; i <= m; i++) {
            cin >> x >> y;
            v[x].push_back(y);
            v[y].push_back(x);
        }
        bfs();
        if (sets[s]) {
            cout << "Join Player" << endl;
        } else {
            cout << "Cut Player" << endl;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值