首页 > 其他分享 >2021 CCPC 威海站 VP记录(题解)

2021 CCPC 威海站 VP记录(题解)

时间:2022-10-16 14:35:16浏览次数:63  
标签:连胜 int 题解 ll CCPC cin VP res mod

2021 CCPC 威海站 VP记录(题解)

题目顺序为vp时开题顺序:

A - Goodbye, Ziyin!

签到,连边数小于等于2的可以作为二叉树根,若有大于4的直接输出0。
code:

void solve(){
	int n;
	cin >> n;
	map<int,int> cnt;
	for (int i = 0;i < n - 1;i ++) {
		int x,y;
		cin >> x >> y;
		cnt[x]++;
		cnt[y]++;
	}
	int ans = 0;
	for (auto [u,v] : cnt) {
		if(v >= 4) {
			cout << 0 << endl;
			return ;
		}
		else if(v <= 2) ans++;
	}
	cout << ans << endl;
}

J - Circular Billiard Table

分析:每次碰撞圆心角不会改变,根据这个性质,可以推出回到原点时一定走过了\(360^{\circ}\)的倍数,可以推出公式(代码来自队友)
code:

void car()
{
    a*=2;
    ll c=360*b;
    ll d=c/__gcd(c,a)*a;
    cout<<d/a-1<<endl;
}
signed main()
{
    ios::sync_with_stdio(false);
    cin>>t;
    while(t--)
    {
        cin>>a>>b;
        car();
    }
 
 
    cerr<<endl<<"carnation13"<<endl;
    return 0;
}

M 810975

题意:n局游戏,赢了m场,连胜最多为k场,求最后方案数
分析:典型隔板法,如果没有连胜最多为k场这个条件,就是经典公式了\(ans = \binom{n - m}{n + m - 1}\)(发现离散学的这个公式蛮方便的)。解释下这个公式,其实就是隔板放球的模型,把赢得局想成球,输的局想成板,那就是\(n + m -1\)个地方放\(n - m\)个板(可重复组合问题)。
然后为了满足最多连胜为k场,在vp的时候和队友推了下感觉正推不好做,于是可以想到用容斥去算出来不合法的方案数,最后用总方案数减去不合法的方案数即可。
考虑不合法的方案数,我们可以这么考虑,有\(n - m + 1\)段是连胜的区间,那我们可以类似于devu和鲜花那题,把每一段恰好为\(k + 1\)的情况给算出来容斥掉,就是最后的答案了。
所以公式为:

\[ans = \binom{n + m - 1}{n - m} + \sum_{i = 1}^{n - m + 1}((-1)^{i+1}*\binom{n - m + 1}{i}*\binom{n - i * (k + 1)}{n - m}) \]

稍微解释一下,这里的\(i\)表示\(n + + m - 1\)段连胜段里选取\(i\)段,且这\(i\)段正好为连胜\(k + 1\)场的情况。
然后这个公式对应的是连胜最多场数小于等于\(k\)场的情况,减去小于等于\(k-1\)的方案数就是最后答案啦

int cal(int n,int m,int k) {
	int res = 0;
	res = C(n + m - 1,n - m);
	int neg = 1;
	for (int i = 0;i <= n - m + 1;i ++) {
		// if(i * (k + 1) >= m) break;
		res = (res + neg * C(n - m + 1 , i) % mod * C(n - i * (k + 1),n - m) % mod) % mod;
		res = (res + mod) % mod;
		neg = -neg;
	}
	return res;
}
void solve(){
	int n,m,k;
	cin >> n >> m >> k;
	int ans = 0;
	if(n < m || k > m) {
		cout << 0 << endl;
		return ;
	}
	ans = cal(n,m,k) - cal(n,m,k - 1);
	ans = (ans % mod + mod) % mod;
	cout << ans << endl;
}

G - Shinyruo and KFC

分析:非常明显的暴力题,题目限定了数据范围是所有数总和小于等于2e5,所以他肯定是两种情况,要么最大的数特别大,前面的都不用算,要么是最大的数不太大,会变成有点类似于分块的处理方法。在同一块内的组合数一起算掉就可以了(这其实是我赛场口胡的,队友听完后打了一个桶思想的代码顺利ac,可能直接看大佬队友的代码就可以了)
code:

signed main(){
	init();
	ios::sync_with_stdio(false);
	cin.tie(nullptr);cout.tie(nullptr);
	cin>>q>>w;
	for(i=1;i<=q;i++)
	{
		cin>>f[i];
		ton[f[i]]++;
	}
	sort(f+1,f+1+q);
	for(i=1;i<=q;i++)
	{
		if(f[i]!=f[i-1])
		cnt++;
		g[cnt]=f[i];
	}
	maxn=min(g[cnt],w);
	for(i=1;i<maxn;i++) cout<<0<<endl;
	for(i=maxn;i<=w;i++)
	{
		ans=1;
		for(int j=1;j<=cnt;j++)
		{
			//cout<<i<<" "<<f[j]<<" "<<C(i,f[j])<<endl;
			ans=ans*qmi(C(i,g[j]),ton[g[j]])%mod;
 
		}
			cout<<ans<<endl;		
	}
} 

D - Period

分析:哈希暴力水题,我队因为一直在想kmp做法一直wa(字符串确实不太会),后来发现暴力hash即可,没啥好说的看代码(来自队友)吧qwq(过的人第三多的签到题了)
code:

#include<bits/stdc++.h>
using namespace std;
typedef long long unsigned ll;
#define rep(i,a,b) for(ll i=a;i<=b;++i)
#define per(i,a,b) for(ll i=a;i>=b;--i)
const ll N=1000005,base=131,mod=212370440130137957ll;
ll n,m,k,q,now=0,c[N];
char s[N];
signed main()
{
    //ios::sync_with_stdio(false);
    scanf("%s",s+1);
    n=strlen(s+1);
    ll a=0,b=0,w=1;
    for(ll i=1;i<=n;++i)
    {
        a=(a*base+s[i]);
        //cout<<a<<" ";
        b=((w*s[n-i+1])+b);
        w=(w*base);
        //cout<<b<<endl;
        if(a==b)c[i]=++now;
        else c[i]=now;
    }
    //for(ll i=1;i<=n;++i)cout<<c[i]<<" ";cout<<endl;
    scanf("%lld",&q);
    for(ll i=1;i<=q;++i)
    {
        ll x;
        scanf("%lld",&x);
        ll mi=min(x,n-x+1)-1;
        printf("%lld\n",c[mi]);
    }
 
 
    //cerr<<endl<<"carnation13"<<endl;
    return 0;
}

总结:新队伍的第二场vp,比上一场签完到就各种痛苦wa不会写的情况要好一点,五题其实是在三个小时多点的时候完成的,如果是实际比赛可能能出更多的题(可能吧),这个赛季加油了。

标签:连胜,int,题解,ll,CCPC,cin,VP,res,mod
From: https://www.cnblogs.com/zwh-zzz/p/16795240.html

相关文章

  • [题解] Codeforces Global Round 23 1746 A B C D E1 F 题解
    点我看题求点赞A.Maxmina首先序列全0的情况肯定是NO。否则,如果\(k\ge3\),则在序列中随便找一个1,把他左边和右边分别用第一种操作不断缩,直到序列长度为k为止,最后用一次2......
  • CF1153F 题解
    传送门题意有一段长为\(l\)的线段,有\(n\)个区间,左右端点在\([0,l)\)间均匀随机(可能不是整数)。求期望被至少\(k\)段区间覆盖的长度,对\(998244353\)取膜模。题......
  • Codeforces Global Round 23题解
    T1link大水题,不想说最后一定可以把一个序列消成长度为\(k\)的带一序列,前提是其原来就有一所以贪心就是如果有一,就行,反之不行codeT2linkwssb,考试的时候居然想了大......
  • Codeforces Global Round 23 (A-E1)个人题解
    A-Maxmina给定一个01串,我们可以将k个数变为他们的最大值(k个数变成1个数),或者将相邻的两个数变为他们的最小值(2个数变成1个数),询问是否可以将这个01串变成仅含有一个1的......
  • Codeforces Global Round 23 题解
    ContestLink我是智障。A.MaxminaProblemLink显然当数组中全是\(0\)的时候,最后不可能变成\(1\),因为我们只有相邻取\(\min\)和区间取\(\max\)两种操作,并没有任......
  • 2020CCPC秦皇岛-K. Kingdom's Power(树形DP + 贪心)
    题意给出一个有n个节点的有根树,1为根节点,根节点有无穷多个兵,每一秒可以让任意一个兵向任意一个地方移动一步,兵所到的点被占领,问最少需要经过多少秒,才能将所有的点都占领......
  • AtCoder Beginner Contest 273 题解
    第一次AtCoder体验,不是很好。ARecursiveFunction原题链接大水题。只要会递归就会做。点击查看代码#include<cstdio>#include<iostream>#definelllonglong......
  • 【题解】古代猪文
    \(\textrm{luoguP2480[SDOI2010]古代猪文}\)所以说嘛,我现在才刚入数论的门。简要题意:求\(\largeg^{\sum_{d\midn}\binom{n}{d}}\)在模\(999911659\)意义下的......
  • MAC MYSQL问题解决方案
    目录下载安装添加环境变量下载安装添加环境变量zsh:commandnotfound:mysql说明环境变量没有添加上方案一:cd~vim~/.bashrc//打开的文档中加入下面这句话alia......
  • 「题解」Codeforces 441E Valera and Number
    感觉是dp好题啊!这里令\(n\)作为原题面中的\(k\).方法一:我认为的通过常规思路想出来的做法。正常思路是设\(f_{i,x}\)表示操作了\(i\)步得到\(x\)的概率。但是......