传送门:https://atcoder.jp/contests/abc154/tasks
A
#include<bits/stdc++.h>
using namespace std;
int main(){
string a, b; cin>>a>>b;
int x, y; cin>>x>>y;
string u; cin>>u;
if(u==a) x--; else y--;
cout<<x<<' '<<y<<endl;
return 0;
}
B
#include<bits/stdc++.h>
using namespace std;
int main(){
string s; cin>>s;
int n=s.size();
while(n--) cout<<'x';
return 0;
}
C
#include<bits/stdc++.h>
using namespace std;
map<int, int> mp;
int main(){
int n; cin>>n;
bool ok=true;
while(n--){
int v; cin>>v;
mp[v]++;
if(mp[v]==2){
ok=false;
break;
}
}
puts(ok? "YES": "NO");
return 0;
}
D
很简单的求个期望
#pragma GCC optimize("O3")
#include<bits/stdc++.h>
using namespace std;
#define endl '
'
#define debug(x) cerr << #x << ": " << x << endl
#define pb(a) push_back(a)
#define set0(a) memset(a,0,sizeof(a))
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define dwn(i,a,b) for(int i=(a);i>=(b);i--)
#define ceil(a,b) (a+(b-1))/b
#define INF 0x3f3f3f3f
#define ll_INF 0x7f7f7f7f7f7f7f7f
typedef long long ll;
typedef pair<int,int> PII;
typedef pair<double,double> PDD;
#define int long long
inline void read(int &x) {
int s=0;x=1;
char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-')x=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=(s<<3)+(s<<1)+ch-'0',ch=getchar();
x*=s;
}
const int N=2e5+5;
int n, k;
int w[N], s[N];
signed main(){
read(n), read(k);
rep(i,1,n) read(w[i]), s[i]=s[i-1]+w[i];
int res=0;
rep(i,k,n) res=max(res, s[i]-s[i-k]);
double ans=(double)(res+k)/2;
printf("%.8lf", ans);
return 0;
}
E
恶心的分类讨论 qwq
#pragma GCC optimize("O3")
#include<bits/stdc++.h>
using namespace std;
#define endl '
'
#define debug(x) cerr << #x << ": " << x << endl
#define pb(a) push_back(a)
#define set0(a) memset(a,0,sizeof(a))
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define dwn(i,a,b) for(int i=(a);i>=(b);i--)
#define ceil(a,b) (a+(b-1))/b
#define INF 0x3f3f3f3f
#define ll_INF 0x7f7f7f7f7f7f7f7f
typedef long long ll;
typedef pair<int,int> PII;
typedef pair<double,double> PDD;
inline void read(int &x) {
int s=0;x=1;
char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-')x=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=(s<<3)+(s<<1)+ch-'0',ch=getchar();
x*=s;
}
string s;
int k;
int C(int a, int b){
if(b>a) return 0;
int res=1;
dwn(i,a,a-b+1) res*=i;
int down=1;
rep(i,1,b) down*=i;
return res/down;
}
int cal(string s){
int n=s.size();
if(!n) return 0;
int res=0;
res+=C(n-1, 2)*9*9;
res+=(s[0]-'0'-1)*(n-1)*9;
int p=-1;
rep(i,1,n-1) if(s[i]!='0'){
p=i;
break;
}
if(p==-1) return res;
else{
int last=n-p;
res+=s[p]-'0'+(last-1)*9;
return res;
}
}
int main(){
cin>>s>>k;
int n=s.size();
if(k==1){
int res=0;
res+=s[0]-'0';
res+=(n-1)*9;
cout<<res<<endl;
}
else if(k==2){
cout<<cal(s)<<endl;
}
else{
int res=0;
res+=C(n-1, 3)*9*9*9;
res+=(s[0]-'0'-1)*C(n-1, 2)*9*9;
int p=-1;
rep(i,1,n-1) if(s[i]!='0'){
p=i;
break;
}
if(p==-1) cout<<res<<endl;
else{
res+=cal(s.substr(p));
cout<<res<<endl;
}
}
return 0;
}
F
由题意,(f(i,j)) 表示从 ((0,0)) 到 ((i,j)) 的方案数,显然,(f(i,j) = C_{i+j}^j = C_{i+j}^i) (这样考虑:从 ((0,0)) 到 ((i,j)) 需要沿 (x) 轴方向走 (i) 步,沿 (y) 轴方向走 (j) 步,共 (i+j) 步,这 (i+j) 步中可以选择 (i) 步沿 (x) 轴方向走剩下的沿 (y) 方向)。
(f(i, j)) 有这样一个性质:(f(i, j) = sum_{k=0}^j f(i-1, k))
这个性质的证明如下:
显然 (i = 1) 时上式成立。
设 (i = u-1) 时上式成立,那么 (i = u) 时
(f(u, j) = C_{u+j}^j = C_{u+j-1}^{j-1} + C_{u+j-1}^j = C_{u+j-1}^{j-1} + f(u-1, j) = sum_{k=0}^{j-1} f(u-1, k) + f(u-1, j) = sum_{k=0}^j f(u-1, k))
证毕
使用容斥原理进行进一步化简,
只需求的柿子式子为:(sum_{i=0}^r sum_{j=0}^c C_{i+j}^i)
对上式变换:
(sum_{i=0}^r sum_{j=0}^c f(i, j) = sum_{i=0}^rf(i+1, c))
对这个柿子进行枚举统计即可。
#pragma GCC optimize("O3")
#include<bits/stdc++.h>
using namespace std;
#define endl '
'
#define debug(x) cerr << #x << ": " << x << endl
#define pb(a) push_back(a)
#define set0(a) memset(a,0,sizeof(a))
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define dwn(i,a,b) for(int i=(a);i>=(b);i--)
#define ceil(a,b) (a+(b-1))/b
#define INF 0x3f3f3f3f
#define ll_INF 0x7f7f7f7f7f7f7f7f
typedef long long ll;
typedef pair<int,int> PII;
typedef pair<double,double> PDD;
#define int long long
inline void read(int &x) {
int s=0;x=1;
char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-')x=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=(s<<3)+(s<<1)+ch-'0',ch=getchar();
x*=s;
}
const int N=2e6+6, mod=1e9+7;
ll fpow(ll x,ll p)
{
ll res=1;
for(;p;p>>=1,x=x*x%mod)
if(p&1)res=res*x%mod;
return res%mod;
}
ll inv(ll x){
return fpow(x,mod-2)%mod;
}
ll fac[N];
void init(){
fac[0]=1;
for(int i=1; i<N; i++) fac[i]=fac[i-1]*i%mod;
}
ll C(ll a, ll b){
return fac[a]*inv(fac[b])%mod*inv(fac[a-b])%mod;
}
int f(int i, int j){
return C(i+j, i);
}
int cal(int r, int c){
int res=0;
rep(i,0,r) res+=f(i+1, c);
cerr<<"imsb"<<endl;
return res;
}
signed main(){
init();
int r1, c1, r2, c2; cin>>r1>>c1>>r2>>c2;
// debug(cal(0, 0));
int res=cal(r2, c2)-cal(r1-1, c2)-cal(r2, c1-1)+cal(r1-1, c1-1);
cout<<(res%mod+mod)%mod<<endl;
return 0;
}