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;
}
本文来自博客园,作者:coding_goat_qwq,转载请注明原文链接:https://www.cnblogs.com/CodingGoat/p/18810632

浙公网安备 33010602011771号