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不会写的情况要好一点,五题其实是在三个小时多点的时候完成的,如果是实际比赛可能能出更多的题(可能吧),这个赛季加油了。

最新文章

  1. Mac上安装django
  2. C#利用HttpWebRequest进行post请求的示例(HTTPS)
  3. Solve one floodlight install problem
  4. Android(java)学习笔记73:线程组的概述和使用
  5. LeetCode (10): Regular Expression Matching [HARD]
  6. java 自动装箱、自动拆箱
  7. 反向代理(Reverse Proxy)
  8. SASS使用CSS3动画并使动画暂停和停止在最后一帧的简单例子
  9. Brackets - 强大免费的开源跨平台Web前端开发工具IDE (HTML/CSS/Javascript代码编辑器)
  10. 【转】为什么选择Spring Boot作为微服务的入门级微框架
  11. USACO奶牛赛跑(逆序对)
  12. selenium “could not be scrolled into view”
  13. vue根据路由变换,切换导航栏样式
  14. Paper | 深度网络中特征的可迁移性
  15. python--递归(附利用栈和队列模拟递归)
  16. c# c/s 框架的分页用户控件,还有事件
  17. Linux - 查看进程状态
  18. 简单的Excel导入(上传、解析、持久化)
  19. LOJ#6491. zrq 学反演(莫比乌斯反演 杜教筛)
  20. double类型与Double包装类型

热门文章

  1. JavaWeb--Servlet详解
  2. 使用python3.7+Vue.js2.0+Django2.0.4异步前端通过api上传文件到七牛云云端存储
  3. 解决linux下U盘变成只读模式
  4. navicat创建连接 2002-can‘t connect to server on ....
  5. DTSE Tech Talk丨第3期:解密数据隔离方案,让SaaS应用开发更轻松
  6. &#128077;CleanShot X 3.1.1 破解版 (超强屏幕截图录像工具) (TNT + 免激活)
  7. 自定义View3-水波纹扩散(仿支付宝咻一咻)实现代码、思想
  8. python超多常用知识记录
  9. 中秋快乐!新鲜出炉一篇DjangoAdmin使用合集,DjangoAdmin的功能比你想象的强大!
  10. Docker安装Redis并使用Another Redis Desktop Manager连接