CTU Open Contest 2019 AB题
小菜鸡飘过https://www.jisuanke.com/contest/7321?view=challenges
A: Beer Barrels
题意:给出四个整数:A,B,K,C,;A,B,C都是大于0的个位数,问在所有仅有A或者B组成的K位数中,数字C的个数是多少
思路:
1.先考虑特殊情况:
(1) 如果C不是A或者B 则输出0
(2) 如果K = 0 则输出0
(3) 如果A==B 则输出K
2.再考虑一般情况:
共K位,每位都可能有C,求出共有多少种可能,排列组合问题。
多个 C(i,k)*I 相加
阶乘可以用数组模拟;用快速幂求逆元
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll pow(ll a,ll b,ll mod)
{
ll ans = 1;
while(b!=0)
{
if(b%2==1) ans=(a%mod*ans%mod)%mod;
a = (a%mod*a%mod)%mod;
b = b/2;
}
return ans%mod;
}
int main()
{
ll mod = 1000000007;
ll a,b,k,c;
cin>>a>>b>>k>>c;
if(k==0) cout<<"0"<<endl;
else if(a==b) cout<<k<<endl;
else if(c!=a&&c!=b) cout<<"0"<<endl;
else
{
ll f[1010];
f[0] = 1;
for(int i=1;i<=1000;i++)
{
f[i] = (f[i-1]*i)%mod;
}
ll ans = 0;
for(int i=1;i<=k;i++)
{
ll t = (i%mod*f[k]%mod* pow(f[i],mod-2,mod)%mod * pow(f[k-i],mod-2,mod)%mod)%mod;
ans = (ans%mod +t%mod)%mod;
}
cout<<ans<<endl;
}
return 0;
}
B: Beer Bill
题意:计算字符串的价格,给多个字符串,每个占一行,一种字符串名叫Raked Line 只含有C个‘|’字符,这种字符价格定义为42*C,另一种叫 Priced Line,格式以数字开头,中间用“,-”连接,结尾是连续的C个‘|’,这种字符串的价格定义为price*C,若结尾没有‘|’出现则C默认为一个,计算所有字符串的总价,总价向上去整到10的倍数。
思路:通过第一个字符判断是第一种还是第二种,在按要求输出(四舍五入到最接近10的倍数)
AC代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
string s;
int ans = 0;
while(cin>>s)
{
int count = 0;
if(s[0]=='|')
{
count = 42*s.length();
}else{
int x = 0;
int sum = 1;
for(int i=0;i<s.length();i++){
if(s[i]>='0'&&s[i]<='9'){
x = x*10+(s[i]-'0');
}
if(s[i]=='|') sum++;
}
if(sum!=1) sum--;
count = x*sum;
}
ans+=count;
}
if(ans%10!=0)
{
int t = ans/10+1;
ans = t*10;
}
cout<<ans<<",-"<<endl;
return 0;
}