AtCoder Beginner Contest 400 (abc400) 赛后复盘 _

怎么在傻福场上到分了。

A&B

简单题,代码见下。

A
#include<bits/stdc++.h>

#define pii pair<int,int> 
#define pll pair<long long,long long> 
#define ll long long
#define i128 __int128

#define mem(a,b) memset((a),(b),sizeof(a))
#define m0(a) memset((a),0,sizeof(a))
#define m1(a) memset(a,-1,sizeof(a))
#define lb(x) ((x)&-(x))
#define lc(x) ((x)<<1)
#define rc(x) (((x)<<1)|1)
#define pb(G,x) (G).push_back((x))
#define For(a,b,c) for(int a=(b);a<=(c);a++)
#define Rep(a,b,c) for(int a=(b);a>=(c);a--)
#define in1(a) a=read()
#define in2(a,b) a=read(), b=read()
#define in3(a,b,c) a=read(), b=read(), c=read()
#define in4(a,b,c,d) a=read(), b=read(), c=read(), d=read()
#define fst first 
#define scd second 
#define dbg puts("IAKIOI")

using namespace std;

int read() {
	int x=0,f=1; char c=getchar();
	for(;c<'0'||c>'9';c=getchar()) f=(c=='-'?-1:1); 
	for(;c<='9'&&c>='0';c=getchar()) x=(x<<1)+(x<<3)+(c^48);
	return x*f;
}
void write(int x) { if(x>=10) write(x/10); putchar('0'+x%10); }

const int mod = 998244353;
int qpo(int a,int b) {int res=1; for(;b;b>>=1,a=(a*a)%mod) if(b&1) res=res*a%mod; return res; }
int inv(int a) {return qpo(a,mod-2); }

#define maxn 200050

int a;

void work() {
	cin>>a;
	if(400%a!=0) cout<<-1;
	else cout<<400/a;
}

signed main() {
//	freopen("data.in","r",stdin);
//	freopen("myans.out","w",stdout);
//	ios::sync_with_stdio(false); 
//	cin.tie(0); cout.tie(0);
	double stt=clock();
	int _=1;
//	_=read();
//	cin>>_;
	For(i,1,_) {
		work();
	}
	cerr<<"\nTotal Time is:"<<(clock()-stt)*1.0/1000<<" second(s)."<<'\n';
	return 0;
}
B
#include<bits/stdc++.h>

#define int ll
#define pii pair<int,int> 
#define pll pair<long long,long long> 
#define ll long long
#define i128 __int128

#define mem(a,b) memset((a),(b),sizeof(a))
#define m0(a) memset((a),0,sizeof(a))
#define m1(a) memset(a,-1,sizeof(a))
#define lb(x) ((x)&-(x))
#define lc(x) ((x)<<1)
#define rc(x) (((x)<<1)|1)
#define pb(G,x) (G).push_back((x))
#define For(a,b,c) for(int a=(b);a<=(c);a++)
#define Rep(a,b,c) for(int a=(b);a>=(c);a--)
#define in1(a) a=read()
#define in2(a,b) a=read(), b=read()
#define in3(a,b,c) a=read(), b=read(), c=read()
#define in4(a,b,c,d) a=read(), b=read(), c=read(), d=read()
#define fst first 
#define scd second 
#define dbg puts("IAKIOI")

using namespace std;

int read() {
	int x=0,f=1; char c=getchar();
	for(;c<'0'||c>'9';c=getchar()) f=(c=='-'?-1:1); 
	for(;c<='9'&&c>='0';c=getchar()) x=(x<<1)+(x<<3)+(c^48);
	return x*f;
}
void write(int x) { if(x>=10) write(x/10); putchar('0'+x%10); }

const int mod = 998244353;
int qpo(int a,int b) {int res=1; for(;b;b>>=1,a=(a*a)%mod) if(b&1) res=res*a%mod; return res; }
int inv(int a) {return qpo(a,mod-2); }

#define maxn 200050

int a,n,m,sum;

void work() {
	in2(n,m);
	sum=a=1;
	For(i,1,m) {
		int res=a*n;
		if(sum+res>1e9) return cout<<"inf",void();
		a*=n;
		sum+=res;
	}
	cout<<sum<<'\n';
}

signed main() {
//	freopen("data.in","r",stdin);
//	freopen("myans.out","w",stdout);
//	ios::sync_with_stdio(false); 
//	cin.tie(0); cout.tie(0);
	double stt=clock();
	int _=1;
//	_=read();
//	cin>>_;
	For(i,1,_) {
		work();
	}
	cerr<<"\nTotal Time is:"<<(clock()-stt)*1.0/1000<<" second(s)."<<'\n';
	return 0;
}

C

因为一个 400 数由两部分组成:\(2^a\)\(b^2\),我们考虑枚举两部分中的一部分。
因为 \(N\le 10^{18}\),所以我们理所当然的枚举 \(2^a\)
我们二分查找 \(b\) 的值,但是我们要避免出现重复枚举的情况。
我们发现只要 \(b\) 的因子里有 \(2\),那么这个就可以表示为 \(2^ab^2\) 或者 \(\large \frac{2^{a+2}b^2}4\)。所以我们在统计答案时二分出来的答案 \(l\),实际上只会有 $\large \lceil \frac l2 \rceil $ 的贡献。

点击查看代码
#include<bits/stdc++.h>

#define int i128
#define pii pair<int,int> 
#define pll pair<long long,long long> 
#define ll long long
#define i128 __int128

#define mem(a,b) memset((a),(b),sizeof(a))
#define m0(a) memset((a),0,sizeof(a))
#define m1(a) memset(a,-1,sizeof(a))
#define lb(x) ((x)&-(x))
#define lc(x) ((x)<<1)
#define rc(x) (((x)<<1)|1)
#define pb(G,x) (G).push_back((x))
#define For(a,b,c) for(int a=(b);a<=(c);a++)
#define Rep(a,b,c) for(int a=(b);a>=(c);a--)
#define in1(a) a=read()
#define in2(a,b) a=read(), b=read()
#define in3(a,b,c) a=read(), b=read(), c=read()
#define in4(a,b,c,d) a=read(), b=read(), c=read(), d=read()
#define fst first 
#define scd second 
#define dbg puts("IAKIOI")

using namespace std;

int read() {
	int x=0,f=1; char c=getchar();
	for(;c<'0'||c>'9';c=getchar()) f=(c=='-'?-1:1); 
	for(;c<='9'&&c>='0';c=getchar()) x=(x<<1)+(x<<3)+(c^48);
	return x*f;
}
void write(int x) { if(x>=10) write(x/10); putchar('0'+x%10); }

const int mod = 998244353;
int qpo(int a,int b) {int res=1; for(;b;b>>=1,a=(a*a)%mod) if(b&1) res=res*a%mod; return res; }
int inv(int a) {return qpo(a,mod-2); }

#define maxn 200050

int n,ans,p[67];

void work() {
	in1(n);
	p[0]=1;
	For(i,1,66) p[i]=p[i-1]*2;
	For(i,1,64) {
		if(p[i]>n) break;
		int l=1,r=1e9;
		while(l<r) {
			int mid=l+r+1>>1;
			if(p[i]*mid*mid>n) r=mid-1;
			else l=mid;
		}
//		write(l); puts("");
		ans+=(l+1)/2;
	}
	write(ans);
}

signed main() {
//	freopen("data.in","r",stdin);
//	freopen("myans.out","w",stdout);
//	ios::sync_with_stdio(false); 
//	cin.tie(0); cout.tie(0);
	double stt=clock();
	int _=1;
//	_=read();
//	cin>>_;
	For(i,1,_) {
		work();
	}
	cerr<<"\nTotal Time is:"<<(clock()-stt)*1.0/1000<<" second(s)."<<'\n';
	return 0;
}

D

BFS。
搜索的时候带上权值,丢进优先队列里面,按权值排序。
给每个点记录到该点的最小权值,如果当前权值大于等于该点的最小权值,那么就不如之前的。
然后搜索的时候,如果下一个点是墙,就把下一个点和再前一步的点进队。
没了。

点击查看代码
#include<bits/stdc++.h>

#define pii pair<int,int> 
#define pll pair<long long,long long> 
#define ll long long
#define i128 __int128

#define mem(a,b) memset((a),(b),sizeof(a))
#define m0(a) memset((a),0,sizeof(a))
#define m1(a) memset(a,-1,sizeof(a))
#define lb(x) ((x)&-(x))
#define lc(x) ((x)<<1)
#define rc(x) (((x)<<1)|1)
#define pb(G,x) (G).push_back((x))
#define For(a,b,c) for(int a=(b);a<=(c);a++)
#define Rep(a,b,c) for(int a=(b);a>=(c);a--)
#define in1(a) a=read()
#define in2(a,b) a=read(), b=read()
#define in3(a,b,c) a=read(), b=read(), c=read()
#define in4(a,b,c,d) a=read(), b=read(), c=read(), d=read()
#define fst first 
#define scd second 
#define dbg puts("IAKIOI")

using namespace std;

int read() {
	int x=0,f=1; char c=getchar();
	for(;c<'0'||c>'9';c=getchar()) f=(c=='-'?-1:1); 
	for(;c<='9'&&c>='0';c=getchar()) x=(x<<1)+(x<<3)+(c^48);
	return x*f;
}
void write(int x) { if(x>=10) write(x/10); putchar('0'+x%10); }

const int mod = 998244353;
int qpo(int a,int b) {int res=1; for(;b;b>>=1,a=(a*a)%mod) if(b&1) res=res*a%mod; return res; }
int inv(int a) {return qpo(a,mod-2); }

#define maxn 1010

int n,m;
int xs,ys,xe,ye;
char mz[maxn][maxn];
int mn[maxn][maxn];

bool ck(int x,int y) {
	return x<=n&&x>=1&&y<=m&&y>=1;
}

struct node {
	int a,b,c;
	bool operator<(const node &x) const {
		return c>x.c;
	}
};
int mx[5]={0,-1,1,0,0},my[5]={0,0,0,-1,1};

void work() {
	in2(n,m);
	For(i,1,n) For(j,1,m) {
		char ch=getchar();
		while(ch!='.'&&ch!='#') ch=getchar();
		mz[i][j]=ch;
	}
	in4(xs,ys,xe,ye);
	priority_queue<node >q;
	q.push({xs,ys,0});
	mem(mn,0x3f);
	while(!q.empty()) {
		auto [x,y,sum]=q.top(); q.pop();
		if(sum>=mn[x][y]) continue;
//		cout<<x<<' '<<y<<' '<<sum<<'\n';
		mn[x][y]=sum;
		For(i,1,4) {
			int X=x+mx[i],Y=y+my[i];
			if(ck(X,Y)&&mz[X][Y]=='.'&&mn[X][Y]>sum) q.push({X,Y,sum});
			else if(ck(X,Y)&&mz[X][Y]=='#'){
				if(mn[X][Y]>sum+1) q.push({X,Y,sum+1});
				X+=mx[i],Y+=my[i];
				if(ck(X,Y)&&mn[X][Y]>sum+1) q.push({X,Y,sum+1});
			}
		}
	}
	cout<<mn[xe][ye]<<'\n';
}

signed main() {
//	freopen("data.in","r",stdin);
//	freopen("myans.out","w",stdout);
//	ios::sync_with_stdio(false); 
//	cin.tie(0); cout.tie(0);
	double stt=clock();
	int _=1;
//	_=read();
//	cin>>_;
	For(i,1,_) {
		work();
	}
	cerr<<"\nTotal Time is:"<<(clock()-stt)*1.0/1000<<" second(s)."<<'\n';
	return 0;
}

E

想到先预处理所有可能的数字。
因为每个数字可以表达成 \(a^{2x}b^{2y}=(a^xb^y)^2\) 的形式,我们只要求出小于等于 \(10^6\) 的所有 \((a^xb^y)\) 就好了。
首先预处理出素数个数。其次对于素数 \(p\) 把小于等于 \(10^6\) 的所有 \(p^k\) 存入一个数组 \(num\)。最后枚举这个数组的每一个元素 \(num_i\),直接向后枚举直到 \(num_i\times num_j\le 10^6\)\(num_j\)\(num_i\) 互质,\(num_i\times num_{j+1} >10^6\) 为止。(由于最多只会有 \(10^6\) 个元素,所以这部不会超时。)这些元素就是我们所求的满足条件的所有数字的算术平方根。我们将其平方放入一个数组,最后查询时二分就好了。

点击查看代码
#include<bits/stdc++.h>

#define int i128
#define pii pair<int,int> 
#define pll pair<long long,long long> 
#define ll long long
#define i128 __int128

#define mem(a,b) memset((a),(b),sizeof(a))
#define m0(a) memset((a),0,sizeof(a))
#define m1(a) memset(a,-1,sizeof(a))
#define lb(x) ((x)&-(x))
#define lc(x) ((x)<<1)
#define rc(x) (((x)<<1)|1)
#define pb(G,x) (G).push_back((x))
#define For(a,b,c) for(int a=(b);a<=(c);a++)
#define Rep(a,b,c) for(int a=(b);a>=(c);a--)
#define in1(a) a=read()
#define in2(a,b) a=read(), b=read()
#define in3(a,b,c) a=read(), b=read(), c=read()
#define in4(a,b,c,d) a=read(), b=read(), c=read(), d=read()
#define fst first 
#define scd second 
#define dbg puts("IAKIOI")

using namespace std;

int read() {
	int x=0,f=1; char c=getchar();
	for(;c<'0'||c>'9';c=getchar()) f=(c=='-'?-1:1); 
	for(;c<='9'&&c>='0';c=getchar()) x=(x<<1)+(x<<3)+(c^48);
	return x*f;
}
void write(int x) { if(x>=10) write(x/10); putchar('0'+x%10); }

const int mod = 998244353;
int qpo(int a,int b) {int res=1; for(;b;b>>=1,a=(a*a)%mod) if(b&1) res=res*a%mod; return res; }
int inv(int a) {return qpo(a,mod-2); }

#define maxn 1000050

bool vis[maxn];
int p[maxn],top;
int num[maxn],siz;
int fnum[maxn],sz;

const int mx=1e6;

void work() {
	For(i,2,mx) {
		if(vis[i]) continue;
		p[++top]=i;
		int bs=i;
		while(bs<=mx) num[++siz]=bs,bs*=i;
		for(int j=i+i;j<=mx;j+=i) vis[j]=1;
	}
	sort(num+1,num+siz+1);
//	For(i,1,siz) cout<<(ll)num[i]<<' '; puts("");
	For(i,1,siz-1) {
		int l=i+1,r=siz;
		while(l<r) {
			int mid=l+r+1>>1;
			if(num[mid]*num[i]<=mx) l=mid;
			else r=mid-1;
		}
//		cout<<(ll)i<<' '<<(ll)l<<'\n';
		if(num[l]*num[i]>mx) continue;
		For(j,i+1,l) if(num[j]%num[i]!=0)
			fnum[++sz]=num[j]*num[j]*num[i]*num[i];
	}
	sort(fnum+1,fnum+sz+1);
	int len=unique(fnum+1,fnum+sz+1)-fnum-1;
//	For(i,1,len) cout<<(ll)fnum[i]<<' '; puts("");
	int q=read();
	while(q--) {
		int x=read();
		write(fnum[upper_bound(fnum+1,fnum+len+1,x)-fnum-1]);
		puts("");
	}
}

signed main() {
//	freopen("data.in","r",stdin);
//	freopen("myans.out","w",stdout);
//	ios::sync_with_stdio(false); 
//	cin.tie(0); cout.tie(0);
	double stt=clock();
	int _=1;
//	_=read();
//	cin>>_;
	For(i,1,_) {
		work();
	}
	cerr<<"\nTotal Time is:"<<(clock()-stt)*1.0/1000<<" second(s)."<<'\n';
	return 0;
}
posted @ 2025-04-05 22:31  coding_goat_qwq  阅读(46)  评论(0)    收藏  举报