AtCoder Beginner Contest 154 题解

传送门: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 '\n'
#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 '\n'
#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)=Ci+jj=Ci+ji (这样考虑:从 (0,0)(i,j) 需要沿 x 轴方向走 i 步,沿 y 轴方向走 j 步,共 i+j 步,这 i+j 步中可以选择 i 步沿 x 轴方向走剩下的沿 y 方向)。

f(i,j) 有这样一个性质:f(i,j)=k=0jf(i1,k)

这个性质的证明如下:
显然 i=1 时上式成立。
i=u1 时上式成立,那么 i=u
f(u,j)=Cu+jj=Cu+j1j1+Cu+j1j=Cu+j1j1+f(u1,j)=k=0j1f(u1,k)+f(u1,j)=k=0jf(u1,k)

证毕

使用容斥原理进行进一步化简,
只需求的柿子式子为:i=0rj=0cCi+ji

对上式变换:
i=0rj=0cf(i,j)=i=0rf(i+1,c)
对这个柿子进行枚举统计即可。

#pragma GCC optimize("O3")
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
#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;
}
posted @   HinanawiTenshi  阅读(70)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示