【19级算法训练赛第九场】题解
题解在B站发布,请点击下面的链接进入。
B站视频讲解
比赛密码:HPUACM
A - Fantasy of a Summation
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <vector>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#define ios ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define debug freopen("in.txt","r",stdin),freopen("out.txt","w",stdout);
#define PI acos(-1)
#define fs first
#define sc second
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const ll maxn = 1e6+10;
double eps = 1e-8;
int T;
ll n,k,mod;
ll ksm(ll a,ll b){
ll res = 1;
while(b){
if(b&1) res = res*a%mod;
a = a*a%mod;
b>>=1;
}
return res;
}
int main(){
cin>>T;
int kase = 0;
while(T--){
scanf("%lld%lld%lld",&n,&k,&mod);
ll ans = 0;
for(int i = 1;i<=n;i++){
ll cur;scanf("%lld",&cur);
ans = (ans + k*cur%mod*ksm(n,k-1)%mod)%mod;
}
printf("Case %d: %lld\n",++kase,ans);
}
return 0;
}B - 又见GCD
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <vector>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#define ios ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define debug freopen("in.txt","r",stdin),freopen("out.txt","w",stdout);
#define PI acos(-1)
#define fs first
#define sc second
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const ll maxn = 1e6+10;
double eps = 1e-8;
int T;
ll a,b;
ll gcd(ll a,ll b){
return !b? a:gcd(b,a%b);
}
int main(){
ios;
cin>>T;
while(T--){
cin>>a>>b;
for(ll c = 2*b;c<1e6+10;c+=b){
if(gcd(a,c) == b){
cout<<c<<endl;
break;
}
}
}
return 0;
}C - Phoneme Palindromes
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <vector>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#define ios ios_base::sync_with_stdio(0),cin.tie(0);
#define debug freopen("in.txt","r",stdin),freopen("out.txt","w",stdout);
#define PI acos(-1)
#define fs first
#define sc second
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const ll maxn = 1e6+10;
double eps = 1e-8;
int T,p,q;
string s;
char mp[300];
bool fun(){
int l = 0,r = s.length()-1;
while(l<=r){
if(s[l] != s[r]) return false;
l++,r--;
}
return true;
}
int main(){
cin>>T;
int kase = 0;
while(T--){
printf("Test case #%d:\n",++kase);
cin>>p;
memset(mp,0,sizeof mp);
while(p--){
char a,b;cin>>a>> b;
mp[a] = b;
}
cin>>q;
while(q--){
cin>>s;cout<<s<<" ";
for(int i = 0;i<s.length();i++){
if(mp[s[i]]) s[i] = mp[s[i]];
}
if(fun()) cout<<"YES\n";
else cout<<"NO\n";
}
cout<<endl;
}
return 0;
}D - Maximum Square
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <vector>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#define ios ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define debug freopen("in.txt","r",stdin),freopen("out.txt","w",stdout);
#define PI acos(-1)
#define fs first
#define sc second
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const ll maxn = 1e6+10;
double eps = 1e-8;
int T,N;
int arr[maxn];
int main(){
ios;
cin>>T;
while(T--){
int res = 0;
cin>>N;
for(int i = 1;i<=N;i++) cin>>arr[i];
sort(arr+1,arr+N+1,greater<int>());
for(int i = 1;i<=N;i++){
res = max(res,min(i,arr[i]));
}
cout<<res<<endl;
}
return 0;
}E - Walk on Matrix
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <vector>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#define ios ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define debug freopen("in.txt","r",stdin),freopen("out.txt","w",stdout);
#define PI acos(-1)
#define fs first
#define sc second
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const ll maxn = 1e6+10;
double eps = 1e-8;
int main(){
ios;
int x = 1<<17,y;
cin>>y;
cout<<"2 3"<<endl;
int ans[2][3] = {
{x|y,y,0},
{x,x|y,y},
};
for(int i = 0;i<2;i++){
for(int j = 0;j<3;j++)
cout<<ans[i][j]<<" ";
cout<<endl;
}
return 0;
}F - A计划
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <vector>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#define ios ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define debug freopen("in.txt","r",stdin),freopen("out.txt","w",stdout);
#define PI acos(-1)
#define fs first
#define sc second
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const ll maxn = 1e6+10;
double eps = 1e-8;
int C,T,N,M;
int endx,endy;
char G[20][20][2];
bool vis[20][20][2];
int dir[4][2] = {-1,0,1,0,0,1,0,-1};
struct pos{
int x,y,z,t;
};
bool BFS(){
memset(vis,0,sizeof vis);
queue<pos> q;
q.push({0,0,0,0});
vis[0][0][0] = true;
while(q.size()){
pos u = q.front();q.pop();
if(u.t <= T && G[u.x][u.y][u.z] == 'P') return true;
for(int i = 0;i<4;i++){
int nx = u.x+dir[i][0];
int ny = u.y+dir[i][1];
int nz = u.z;
if(nx<0 || ny<0 || nx>=N || ny>=M || G[nx][ny][nz] == '*' || vis[nx][ny][nz]) continue;
if(G[nx][ny][nz] == '#'){
if(G[nx][ny][nz^1] == '#' || G[nx][ny][nz^1] == '*' || vis[nx][ny][nz^1]) continue;
else nz^=1;
}
if(u.t+1>T || u.t + abs(nx-endx) + abs(ny-endy) >T) continue;//剪枝
q.push({nx,ny,nz,u.t+1});
vis[nx][ny][nz] = true;
}
}
return false;
}
int main(){
ios;
cin>>C;
while(C--){
cin>>N>>M>>T;
for(int z = 0;z<=1;z++){
for(int x = 0;x<N;x++){
for(int y = 0;y<M;y++){
cin>>G[x][y][z];
if(G[x][y][z] == 'P') endx = x,endy = y;
}
}
}
if(BFS()) cout<<"YES\n";
else cout<<"NO\n";
}
return 0;
}G - Pseudoprime numbers
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <vector>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#define ios ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define debug freopen("in.txt","r",stdin),freopen("out.txt","w",stdout);
#define PI acos(-1)
#define fs first
#define sc second
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const ll maxn = 1e6+10;
double eps = 1e-8;
ll p,a;
ll ksm(ll a,ll b){
ll res = 1;
while(b){
if(b&1) res = res*a%p;
a = a*a%p;
b>>=1;
}
return res;
}
ll is_prime(ll x){
if(x == 2) return true;
for(int i = 2;i*i<=x;i++){
if(x%i == 0) return false;
}
return true;
}
int main(){
ios;
while(cin>>p>>a){
if(p == 0 && a == 0) break;
if(ksm(a,p) != a || is_prime(p)) cout<<"no\n";
else cout<<"yes\n";
}
return 0;
}H - Rightmost Digit
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <vector>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#define ios ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define debug freopen("in.txt","r",stdin),freopen("out.txt","w",stdout);
#define PI acos(-1)
#define fs first
#define sc second
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const ll maxn = 1e6+10;
double eps = 1e-8;
int T;
ll ksm(ll a,ll b){
ll res = 1;
while(b){
if(b&1) res = res*a%10;
a = a*a%10;
b>>=1;
}
return res;
}
int main(){
ios;
cin>>T;
while(T--){
ll n;cin>>n;
cout<<ksm(n,n)<<"\n";
}
return 0;
}I - Co-prime
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <vector>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#define ios ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define debug freopen("in.txt","r",stdin),freopen("out.txt","w",stdout);
#define PI acos(-1)
#define fs first
#define sc second
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const ll maxn = 1e6+10;
double eps = 1e-8;
int T;
int yin[maxn],tail;
ll fun(ll x){
ll res = 0;
for(int i = 1;i<(1<<tail);i++){
ll cur = 1,cnt = 0;
for(int j = 0;j<tail;j++){
if((i>>j) & 1){
cnt++;
cur *= yin[j+1];
}
}
if(cnt&1) res += x/cur;
else res -=x/cur;
}
return x-res;
}
int main(){
cin>>T;
int kase = 0;
while(T--){
tail = 0;
ll a,b,c;cin>>a>>b>>c;
for(int i = 2;i*i<=c;i++){
if(c%i == 0){
yin[++tail] = i;
while(c%i == 0) c/=i;
}
}
if(c>1) yin[++tail] = c;
ll ans = fun(b)-fun(a-1);
printf("Case #%d: %lld\n",++kase,ans);
}
return 0;
}J - 摘花生
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <vector>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#define ios ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define debug freopen("in.txt","r",stdin),freopen("out.txt","w",stdout);
#define PI acos(-1)
#define fs first
#define sc second
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const ll maxn = 1e6+10;
double eps = 1e-8;
int T,N,M;
int arr[111][111];
int dp[111][111];
int main(){
ios;
cin>>T;
while(T--){
cin>>N>>M;
for(int i = 1;i<=N;i++){
for(int j = 1;j<=M;j++){
cin>>arr[i][j];
}
}
memset(dp,0,sizeof dp);
for(int i = 1;i<=N;i++){
for(int j = 1;j<=M;j++){
dp[i][j] = max(dp[i-1][j], dp[i][j-1]) + arr[i][j];
}
}
cout<<dp[N][M]<<"\n";
}
return 0;
}K - 验证子串
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <vector>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#define ios ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define debug freopen("in.txt","r",stdin),freopen("out.txt","w",stdout);
#define PI acos(-1)
#define fs first
#define sc second
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const ll maxn = 1e6+10;
double eps = 1e-8;
string s1,s2;
int main(){
ios;
cin>>s1>>s2;
if(s2.find(s1) != -1) cout<<s1<<" is substring of "<<s2<<"\n";
else if(s1.find(s2) != -1) cout<<s2<<" is substring of "<<s1<<"\n";
else cout<<"No substring\n";
return 0;
}L - 图像旋转
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <vector>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#define ios ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define debug freopen("in.txt","r",stdin),freopen("out.txt","w",stdout);
#define PI acos(-1)
#define fs first
#define sc second
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const ll maxn = 1e6+10;
double eps = 1e-8;
int N,M;
int arr[111][111];
int ans[111][111];
int main(){
ios;
cin>>N>>M;
for(int i = 1;i<=N;i++){
for(int j = 1;j<=M;j++){
cin>>arr[i][j];
}
}
for(int j = 1;j<=M;j++){
for(int i = N;i>=1;i--){
cout<<arr[i][j]<<" ";
}
cout<<"\n";
}
return 0;
}M - 整数去重
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <vector>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#define ios ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define debug freopen("in.txt","r",stdin),freopen("out.txt","w",stdout);
#define PI acos(-1)
#define fs first
#define sc second
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const ll maxn = 1e6+10;
double eps = 1e-8;
int N;
bool st[111];
int main(){
ios;
cin>>N;
while(N--){
int cur;cin>>cur;
if(st[cur]) continue;
cout<<cur<<" ";
st[cur] = true;
}
return 0;
}N - 国王的魔镜
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <vector>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#define ios ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define debug freopen("in.txt","r",stdin),freopen("out.txt","w",stdout);
#define PI acos(-1)
#define fs first
#define sc second
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const ll maxn = 1e6+10;
double eps = 1e-8;
string s;
int main(){
ios;
cin>>s;
while(true){
int len = s.length();
string l = s.substr(0,len/2),r = s.substr(len/2);
reverse(r.begin(),r.end());
if(len%2 || l != r) break;
s = l;
}
cout<<s.length()<<"\n";
return 0;
}O - DIY Wooden Ladder
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <vector>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#define ios ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define debug freopen("in.txt","r",stdin),freopen("out.txt","w",stdout);
#define PI acos(-1)
#define fs first
#define sc second
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const ll maxn = 1e6+10;
double eps = 1e-8;
int T,N;
int arr[maxn];
int main(){
ios;
cin>>T;
while(T--){
cin>>N;
for(int i = 1;i<=N;i++){
cin>>arr[i];
}
sort(arr+1,arr+N+1,greater<int>());
int mi = min(arr[1],arr[2]);
if(N <= 2 || mi <=1) cout<<0<<endl;
else cout<<min(N-2,mi-1)<<endl;
}
return 0;
}P - Dawid and Bags of Candies
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <vector>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#define ios ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define debug freopen("in.txt","r",stdin),freopen("out.txt","w",stdout);
#define PI acos(-1)
#define fs first
#define sc second
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const ll maxn = 1e6+10;
double eps = 1e-8;
int arr[5];
int main(){
ios;
for(int i = 1;i<=4;i++) cin>>arr[i];
sort(arr+1,arr+5);
if(arr[1] + arr[4] == arr[2]+arr[3] || arr[1]+arr[2]+arr[3] == arr[4]) cout<<"YES\n";
else cout<<"NO\n";
return 0;
}Ryuichi的算法分享 文章被收录于专栏
分享我的一些算法题解,致力于把题解做好,部分题解可能会采用视频的形式来讲解。

查看5道真题和解析