A - Three Dice
void solves(){
int a,b,c;cin>>a>>b>>c;
cout<<21-a-b-c<<endl;
}
B - 180°
void solves(){
cin>>s;
for(int i=(int)s.size()-1;i>=0;--i){
if(s[i]=='9')s[i]='6';
else if(s[i]=='6')s[i]='9';
cout<<s[i];
}cout<<endl;
}
C - Made Up
int a[N],b[N],c[N],cnt[N],num[N],qq[N];
void solves(){
int n;cin>>n;
for(int i=1;i<=n;++i){
cin>>a[i];
++num[a[i]];
}
for(int i=1;i<=n;++i) cin>>b[i];
for(int i=1;i<=n;++i){
cin>>c[i];
++cnt[c[i]];
}
for(int i=1;i<=n;++i){
qq[b[i]]+=cnt[i];
}
ll ans=0;
for(int i=1;i<=n;++i){
ans+=qq[a[i]];
}
cout<<ans<<endl;
}
D - aab aba baa
艹,早知道打完蓝桥杯省赛后就该去补题,同样的知识点居然遇到了两次才开始学,我好sb,呜呜。昨晚瞎搞推了一个小时,思路是有一些但是不知道怎么写,感觉高中学的排列组合学了个寂寞,而且也因为蓝桥没补题愣是没和杨辉三角联系在一起,我自闭了,呜呜。
首先这个题肯定是不可能暴力做的,极限数据已经到了
C
60
30
=
118264581564861424
C_{60}^{30}=118264581564861424
C6030=118264581564861424了,暴力铁t
然后我们需要一些前置知识 杨辉三角与组合数
接着我们记‘a’的数量为a,‘b’的数量为b。在a、b均不为0的情况下,共有
C
a
+
b
a
C_{a+b}^a
Ca+ba种按字典序排下来的排列情况。
在字典序的排列中,我们只看第一个字母,分成两类有
C
a
+
b
a
=
C
a
+
b
−
1
a
−
1
+
C
a
+
b
−
1
b
−
1
C_{a+b}^a=C_{a+b-1}^{a-1}+C_{a+b-1}^{b-1}
Ca+ba=Ca+b−1a−1+Ca+b−1b−1
其中
C
a
+
b
−
1
a
−
1
C_{a+b-1}^{a-1}
Ca+b−1a−1是排在字典序前面以a开头的排列种类的数量,
C
a
+
b
−
1
b
−
1
C_{a+b-1}^{b-1}
Ca+b−1b−1是排在后面以b开头的排列种类的数量。
所以我们可以通过比较k与
C
a
+
b
−
1
a
−
1
C_{a+b-1}^{a-1}
Ca+b−1a−1的大小来确定第一个字母是a还是b。然后再分治递推第二个字母是a还是b。
const int N=1e2+7;
ll dp[N][N];
void solves(){
for(int i=0;i<=60;++i) dp[i][0]=1;
for(int i=1;i<=60;++i){
for(int j=1;j<=i;++j){
dp[i][j]=dp[i-1][j]+dp[i-1][j-1];
}
}
ll a,b,k;cin>>a>>b>>k;
while(a&&b){
if(dp[a+b-1][a-1]>=k){
cout<<'a';--a;
} else{
k-=dp[a+b-1][a-1];
cout<<'b';--b;
}
}
while(a)cout<<'a',--a;
while(b)cout<<'b',--b;
cout<<endl;
}