Codeforces Hello 2019
Hello 2019
- 手速场qwq
- 反正EGH太神仙了啊.jpg
- 考试的时候不会啊.jpg
A
暴力.jpg
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <queue>
#include <iostream>
#include <bitset>
using namespace std;
char opt[10],s[10];
int main()
{
scanf("%s",s+1);
for(int i=1;i<=5;i++)
{
scanf("%s",opt+1);
if(opt[1]==s[1]||opt[2]==s[2])return puts("YES"),0;
}
puts("NO");
return 0;
}
B
好像也是傻逼题吧?
感觉题意好难理解啊...
然后直接DP.jpg
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <queue>
#include <iostream>
#include <bitset>
using namespace std;
#define N 16
int a[N],now,ans,n;
void dfs(int dep,int now)
{
if(dep==n+1){if(!now)ans=1;return ;}
dfs(dep+1,(now+a[dep])%360),dfs(dep+1,(now-a[dep]+360)%360);
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);dfs(1,0);
puts(ans?"YES":"NO");
}
C
维护俩信息就好了
$a[i][0],a[i][1]$分别表示左侧多了$i$个左括号,右侧多了$i$个右括号的方案数...
然后就完事了.jpg
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <queue>
#include <iostream>
#include <bitset>
using namespace std;
#define N 500005
#define ll long long
char s[N];
int n,a[N][2],tmp;long long ans;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%s",s+1);int len=strlen(s+1),now=0,hav=0;
for(int j=1;j<=len;j++)
{
if(s[j]=='(')now++;
else
{
if(!now)hav++;
else now--;
}
}
if(hav&&now)continue;
if(now)a[now][0]++;
else if(hav)a[hav][1]++;
else tmp++;
}
ans=tmp>>1;
for(int i=1;i<=500000;i++)ans+=min(a[i][0],a[i][1]);
printf("%lld\n",ans);
}
D
是我太菜.jpg
这个题切不掉真的是傻了啊.jpg
花了好久才搞出来,期间还有来自$app$的提示.jpg
我们发现答案具有积性,也就是说,直接对每个质数维护一遍即可.jpg
$f[i][j]$表示,当前这个质数还有$j$个,已经做了$i$次操作的概率...
转移的话...就直接每个操作的概率做一下就好了.jpg
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <queue>
#include <iostream>
#include <bitset>
using namespace std;
#define N 60
#define K 10005
#define mod 1000000007
#define ll long long
ll P=1,Q;
ll a[N],b[N];
int cnt;
ll qpow(ll x,ll n){ll ret=1;for(;n;n>>=1,x=x*x%mod)if(n&1)ret=ret*x%mod;return ret;}
struct WC
{
ll x,y;
WC operator + (const WC &a) const
{
WC re;
re.x=a.x*y%mod+a.y*x%mod;
re.y=a.y*y%mod;
return re;
}
WC operator * (const WC &a) const
{
WC re;
re.x=a.x*x%mod;
re.y=a.y*y%mod;
return re;
}
WC operator * (ll b) const
{
WC re;
(re.x=x*b)%=mod; re.y=y;
return re;
}
}f[K][N];
int main()
{
ll n,k; cin >> n >> k ;
for(ll i=2;i*i<=n;i++)
{
if(n%i==0)
{
a[++cnt]=i; while(n%i==0) b[cnt]++,n/=i;
}
}
if(n!=1) a[++cnt]=n,b[cnt]=1;
WC Ans=(WC){1,1},Now=(WC){0,1};
for(int i=1;i<=cnt;i++)
{
for(int j=0;j<=k;j++)
{
for(int l=0;l<=b[i];l++)
{
f[j][l]=(WC){0,1};
}
}
f[0][b[i]]=(WC){1,1};
for(int j=1;j<=k;j++)
{
for(int l=0;l<=b[i];l++)
{
for(int r=l;r<=b[i];r++)
{
f[j][l]=f[j][l]+(f[j-1][r]*(WC){1ll,r+1});
}
}
}
Now=(WC){0,1};
for(int j=0;j<=b[i];j++) Now=Now+(f[k][j]*qpow(a[i],j));
Ans=Ans*Now;
}
cout << Ans.x*qpow(Ans.y,mod-2)%mod << endl ;
return 0;
}
E
不会
F
直接bitset就可以了...
然后维护俩bitset,分别表示:这个集合所有数的约数的bitset,莫比乌斯函数的是否为$0$的bitset
然后就可以了...
原理嘛...直接用容斥原理推就好了.jpg
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <queue>
#include <iostream>
#include <bitset>
using namespace std;
#define N 100005
bitset<7005>ans[N],G[7005],F[7005];
int miu[7005],pri[7005],vis[7005],cnt;
void Miu()
{
miu[1]=1;
for(int i=2;i<=7000;i++)
{
if(!vis[i])pri[++cnt]=i,miu[i]=-1;
for(int j=1;j<=cnt&&i*pri[j]<=7000;++j)
{
vis[i*pri[j]]=1;if(i%pri[j]==0)break;
miu[i*pri[j]]=-miu[i];
}
}
}
int n,Q,op,x,y,z;
int main() {
Miu();
for(int i=1;i<=7000;i++)
for(int j=i;j<=7000;j+=i)
G[j][i]=1,F[i][j]=(miu[j/i]?1:0);
scanf("%d%d",&n,&Q);
while(Q--)
{
scanf("%d%d%d",&op,&x,&y);
if(op==1)ans[x]=G[y];
else if(op==2)scanf("%d",&z),ans[x]=ans[y]^ans[z];
else if(op==3)scanf("%d",&z),ans[x]=ans[y]&ans[z];
else printf("%d",((ans[x]&F[y]).count()&1));
}puts("");
}
G
比赛的时候不会第二类斯特林数真是遗憾.jpg
直接斯特林数反演一下:$x^K=\sum\limits_{k=0}{K,k }\times (x,k)\times k!$
然后就是$ans=\sum\limits_{x\subset {1,2,3...n},x\neq 0}\sum\limits_{k=0}^{k\le f(x)}{K,k}\times (f(x),k)\times k!$
换一个枚举顺序就变成了$ans=\sum\limits_{k=0}{K,k}\times k!\sum\limits_{x\subset{1,2,3...n}}(f(x),k)$
然后就可以把问题转化为维护一个$f(x)$的组合数,项数最多为$K$项,也就是变成了一个$O(nk)$的树上背包问题
转移:$f[x][i]=g[i]+\sum\limits_{j=0}^{i-1}g[j]\times f[to][i-j]$,意义:$(f(x),i)=\sum\limits_{j=0}^{i-1}(f(x)-i+j,j)$
然后可以在每个位置更新答案,也就是$ans[i]+=\sum\limits_{j=1}^{i-1}g[j]\times f[to][i-j]$,同样,直接其他就不选了的方案贡献出来
然后同时也需要处理每条边的贡献:$f[to][i]+=f[to][i-1]\times (i\neq1?1:1-2^{-siz[to]})$表达的含义很简单,就是这个子树里选择了一个节点的概率,也就是这条边对答案的贡献...
并且也需要考虑贡献答案,$ans[i]+=f[to][i-1]\times (i==1?1:1-2^{-siz[to]})\times (1-2^{siz[to1]-n})$,同样,代表的意义是处理这个子树之外,其他的节点至少选了一个的概率...
因为对于$(f(x),1)=f(x)$,所以直接将所有的边的概率相加即可,也就是上述式子。
然后就完事了.jpg
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <queue>
#include <iostream>
#include <bitset>
using namespace std;
#define N 100005
#define M 205
#define ll long long
#define mod 1000000007
int q_pow(int x,int n){int ret=1;for(;n;n>>=1,x=(ll)x*x%mod)if(n&1)ret=(ll)ret*x%mod;return ret;}
#define inv(x) q_pow(x,mod-2)
struct node{int to,next;}e[N<<1];
int head[N],siz[N],cnt,f[N][M],s[M][M],fac[M],mi[N],ans[M],n,K;
inline void add(int x,int y){e[cnt]=(node){y,head[x]};head[x]=cnt++;}
void dfs(int x,int from)
{
siz[x]=1;f[x][0]=1;
for(int i=head[x];i!=-1;i=e[i].next)
{
int to1=e[i].to;
if(to1!=from)
{
dfs(to1,x);
for(int j=min(siz[to1],K)-1;~j;j--)
{
int val=f[to1][j];
if(!j)val=(ll)val*(1-mi[siz[to1]])%mod;
ans[j+1]=(ans[j+1]+(ll)val*(1-mi[n-siz[to1]]))%mod;
f[to1][j+1]=(f[to1][j+1]+val)%mod;
}
for(int j=min(siz[x]-1,K);~j;j--)
for(int k=1;k<=siz[to1]&&j+k<=K;k++)
{
int val=(ll)f[to1][k]*f[x][j]%mod;
if(j)ans[j+k]=(ans[j+k]+val)%mod;
f[x][j+k]=(f[x][j+k]+val)%mod;
}
siz[x]+=siz[to1];
}
}
}
#define inv2 500000004
int main()
{
scanf("%d%d",&n,&K);memset(head,-1,sizeof(head));s[0][0]=1;
mi[0]=1;for(int i=1;i<=n;i++)mi[i]=(ll)mi[i-1]*inv2%mod;
for(int i=1,x,y;i<n;i++)scanf("%d%d",&x,&y),add(x,y),add(y,x);dfs(1,0);
for(int i=1;i<=K;i++)for(int j=1;j<=i;j++)s[i][j]=((ll)s[i-1][j]*j+s[i-1][j-1])%mod;
fac[0]=1;for(int i=1;i<=K;i++)fac[i]=(ll)fac[i-1]*i%mod;int ret=0;
for(int i=1;i<=K;i++)ret=(ret+(ll)s[K][i]*ans[i]%mod*fac[i])%mod;ret=(ll)ret*q_pow(2,n)%mod;
printf("%d\n",(ret+mod)%mod);
}
//
H
感觉能做,口胡一发
做一个以$d$为底的倍增,维护这样的信息:$f[i][j]$表示,在原数组$d^i+n$这么长,在原数组$+j$之后的$bitset$大小关系情况。
然后每次倍增求出$f[i+1][j]+=\sum\limits_{k=0}^df[i][(j+gen[d])%m]$
这里的转移没想清楚...但是大概是这个样子,然后对$r$和$l-1$分别做一下就好了.jpg
没有代码.jpg
Codeforces Hello 2019的更多相关文章
- codeforces Hello 2019(未写完)
A. Gennady and a Card Game a题惯例签到题 题意:给你一张牌,再给你5张牌,判断能不能出一次牌... 所以只要检查第二行中的某个卡是否与第一行中的卡具有共同字符 有就输出YE ...
- Codeforces Gym-102219 2019 ICPC Malaysia National E. Optimal Slots(01背包+输出路径)
题意:给你一个体积为\(T\)的背包,有\(n\)个物品,每个物品的价值和体积都是是\(a_{i}\),求放哪几个物品使得总价值最大,输出它们,并且输出价值的最大值. 题解:其实就是一个01背包输出路 ...
- Codeforces Gym-102219 2019 ICPC Malaysia National J. Kitchen Plates (暴力,拓扑排序)
题意:给你5个\(A,B,C,D,E\)大小关系式,升序输出它们,如果所给的大小矛盾,输出\(impossible\). 题意:当时第一眼想到的就是连边然后排序,很明显是拓扑排序(然而我不会qwq,之 ...
- Codeforces Round #517 (Div. 2, based on Technocup 2019 Elimination Round 2)
Codeforces Round #517 (Div. 2, based on Technocup 2019 Elimination Round 2) #include <bits/stdc++ ...
- (AB)Codeforces Round #528 (Div. 2, based on Technocup 2019 Elimination Round
A. Right-Left Cipher time limit per test 1 second memory limit per test 256 megabytes input standard ...
- 【Codeforces Round 1120】Technocup 2019 Final Round (Div. 1)
Codeforces Round 1120 这场比赛做了\(A\).\(C\)两题,排名\(73\). \(A\)题其实过的有点莫名其妙...就是我感觉好像能找到一个反例(现在发现我的算法是对的... ...
- Codeforces Round #517 (Div. 2, based on Technocup 2019 Elimination Round 2) D. Minimum path
http://codeforces.com/contest/1072/problem/D bfs 走1步的最佳状态 -> 走2步的最佳状态 -> …… #include <bits/ ...
- Codeforces Round #517 (Div. 2, based on Technocup 2019 Elimination Round 2) D. Minimum path(字典序)
https://codeforces.com/contest/1072/problem/D 题意 给你一个n*n充满小写字母的矩阵,你可以更改任意k个格子的字符,然后输出字典序最小的从[1,1]到[n ...
- Codeforces Round #528 (Div. 2, based on Technocup 2019 Elimination Round 4) C. Connect Three 【模拟】
传送门:http://codeforces.com/contest/1087/problem/C C. Connect Three time limit per test 1 second memor ...
随机推荐
- 在vue中赋值的路径没有被编译
当我们跑起来的时候,f12会看到相对路径,但是此时会报错,说找不到图片,这时候有其中一个办法,直接 require进去. 这时候就可以成功显示图片,但是路径会不一样,因为编译出来. 至于如何props ...
- api接口签名认证的一种方式
请求方 try { using (var client = new HttpClient()) { StringContent content = new StringContent(strParam ...
- 《Inside C#》笔记(四) 类
类是对数据结构和算法的封装. 一 类成员 类成员包括以下几类,作者在后面的章节会详细讲解. 字段(用来保存数据,可用static readonly const来修饰).方法(操作数据的代码).属性(用 ...
- 给你一个全自动的屏幕适配方案(基于SW方案)!—— 解放你和UI的双手
Calces系列相关文章:Calces自动实现Android组件化模块构建 前言 屏幕适配一直是移动端开发热议的问题,但是适配方案往往在实际开发的时候会和UI提供的设计稿冲突.本文主要是基于官方推荐的 ...
- Expo大作战(三十一)--expo sdk api之Payments(expo中的支付),翻译这篇文章傻逼了,完全不符合国内用户,我只负责翻译大家可以略过!
简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...
- 11.1、socket连接中的粘包、精确传输问题
粘包: 发生原因: 当调用send的时候,数据并不是即时发给客户端的.而是放到了系统的socket发送缓冲区里,等缓冲区满了.或者数据等待超时了,数据才会发送,所以有时候发送太快的话,前一份数据还没有 ...
- docker端口映射启动报错Error response from daemon: driver failed programming external connectivity on endpoint jms_guacamole
问题描述:今天跳板机的一个guacamole用docker重新启动报错了 [root@localhost opt]# docker start d82e9c342a Error response / ...
- 在Centos7下搭建Git服务器
① 安装 Git ② 服务器端创建 git 用户,用来管理 Git 服务,并为 git 用户设置密码 ③ 服务器端创建 Git 仓库 ④ 客户端 clone 远程仓库 ⑤ 客户端创建 SSH 公钥和私 ...
- php开发中遇到的一些问题
php警告提示A session had already been started – ignoring session_start() 解决方案 判断 如果session_id 不存在,说明没有储存 ...
- 【PAT】B1032 挖掘机技术哪家强(20 分)
#include<cstdio> const int maxx= 100010; int school[maxx]={0}; int main() { int n,schid,schsco ...