【CF】Hello 2019!
深夜自闭orz,话说这些题直接翻译机翻成中文为何如此流畅,第一次看见如此流畅的机翻orz,这两场比赛感受到了被各路大神碾压的快感
CF hello 2019
官方题解
A
水题一道,看懂就能秒orz#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
using namespace std;
char ss[15];
char sa[15];
int main() {
scanf("%s",&ss[1]);
for(int i=1;i<=5;i++) {
scanf("%s",&sa[1]);
if(sa[1]==ss[1]) {
puts("YES"); return 0;
}
if(sa[2]==ss[2]) {
puts("YES"); return 0;
}
}
puts("NO");
}
B
水题一道,爆搜完就秒#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int n;
int a[20];
int now;
void dfs(int x) {
if(x==n+1) {
if( (now%360+360)%360==0 ) {
puts("YES"); exit(0);
}
return ;
}
now += a[x];
dfs(x+1);
now -= 2*a[x];
dfs(x+1);
now += a[x];
}
int main() {
scanf("%d",&n);
for(int i=1;i<=n;i++) {
scanf("%d",&a[i]);
}
dfs(1);
puts("NO");
}
C
给你若干个字符串,两个两个配,能够配对最多多少个合法括号序列。 考虑贪心,令两个可以配对的配对就是了。#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
#include<cstdio>
using namespace std;
const int maxn = 5e5+5;
int n,ans;
char ss[maxn];
map<int,int> ld,rd;
int ling;
int main() {
scanf("%d",&n);
for(int i=1;i<=n;i++) {
scanf("%s",&ss[1]);
int le = strlen(ss+1);
int ll = 0; int rr=0;
bool flag = 1;
for(int j=1;j<=le;j++) {
if(ss[j]=='(') {
ll++;
} else {
if(ll>0) ll--;
else rr++;
}
}
if(ll&&rr) continue;
if(ll==0&&rr==0) ling++;
else if(ll) {
if(rd[ll]) rd[ll]--,ans++;
else ld[ll]++;
} else {
if(ld[rr]) ld[rr]--,ans++;
else rd[rr]++;
}
}
printf("%d",ling/2+ans);
}
D
考试的时候基本上所有的时间都肝在D题了,然而还是跪的 题意:开始给定一个数 n<= 1e15 , 每次等概率变成他的因数,求k次(k<=1e4)之后,他变成的数的期望值。(答案在mod 1e9+7意义下) 其实考场上想到dp方程还是很容易的,可是我们要想到每个质数的幂之间是独立算dp,最后是可以乘起来的.(智障如我就没想到)#include<algorithm>
#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
typedef long long ll;
const int mod = 1e9+7;
int add(int x,int y) { x+=y; return x>=mod?x-mod:x; }
int sub(int x,int y) { x-=y; return x<0?x+mod:x; }
int mul(int x,int y) { return 1ll*x*y%mod; }
int inv[105];
ll n; int k;
int f[105];
int DP(int pp,int cc) {
f[0]=1;
for(int i=1;i<=cc;i++) f[i] = mul(f[i-1],pp);
for(int i=1;i<=k;i++) {
for(int j=1;j<=cc;j++) {
f[j] = add(f[j],mul(f[j-1],j));
f[j] = mul(f[j],inv[j+1]);
}
}
return f[cc];
}
int main() {
int ans = 1;
scanf("%I64d%d",&n,&k);
inv[1] = inv[0] = 1;
for(int i=2;i<=100;i++) inv[i] = mul(inv[mod%i],mod-mod/i);
for(ll i=2;i*i<=n;i++) {
if(n%i==0) {
int cc = 0;
while(n%i==0) cc++,n/=i;
ans = mul(ans,DP(i,cc));
}
}
if(n>1) ans = mul(ans,DP(n%mod,1));
printf("%d",ans);
}