2025吉林长春CCPC
这个题简单题中等题偏多,对大一蒟蒻比较友好。本次比赛暴露出的问题就是模拟题写少了,一想到模拟的方法就不会把它当作最优解,实现能力也有欠缺
好了,接下来开始补题~
Problem C. 和和和和和和 积积积积积积 和和和 积积积和和和积


这个题看着非常的复杂,其实就一个加和乘的操作。
从内层到外层一步步查,S就加n次,P就乘n次。加的操作可以直接✖️n,减少时间复杂度。
代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
int a[15];
const int mod=998244353;
signed main()
{int n,k;cin>>n>>k;int sum=0;int sum1=1;for(int i=0;i<n;i++){cin>>a[i];sum+=a[i];sum%=mod;sum1*=a[i];sum1%=mod;}string s;cin>>s;int ans=0;if(s[s.size()-1]=='s')sum=sum%mod;elsesum=sum1%mod;for(int i=s.size()-2;i>=0;i--){if(s[i]=='s'){int ans=sum%mod;sum*=n;sum%=mod;}else{int ans=sum%mod;for(int i=0;i<n-1;i++){sum*=ans;sum%=mod;}}}cout<<sum%mod<<endl;return 0;
}
Problem D. 互互互 质质质
题目链接: Problem - D - Codeforces

这个题就没什么好说的,从左边界直接便利到右边界就行了。不可能会存在找了很久都没找到复合条件的导致超时。要么就是两个数离得很近,没有符合条件的,不然在有限的长度内一定能找到符合条件的数。
代码:
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int, int>
#define fi first
#define se second
const int N = 1e5+1;
int a[N];
string s,s1;
vector<int> v;
int ans;
int n;
int x,y,z;
bool check(int n)
{if(__gcd(x,n)==1&&__gcd(y,n)==1)return 1;return 0;
}
void solve()
{cin >> x >> y; for(int i=x+1; i<=y-1; i++){if(check(i)){cout << i << endl;return ;}}cout << -1 << endl;
}
/*
3
1 3
115 125
2184 2200
*/
signed main()
{ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int t=1;cin >> t;while(t--) solve();return 0;
}
F、Ever Forever
题目链接:codeforces.com/gym/105922/problem/F
这个题也非常的好懂,就是将所有的ef串的距离相加(顺序敏感)。由于f可以和前面所有的e进行配对,所以当遇到e的时候可以将它的下标用vector存起来,方便之后相加。遇到f的时候遍历vector将此时f前面所有e之间的距离相加。
代码:
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int, int>
#define fi first
#define se second
const int N = 1e5+1;
int a[N];
string s,s1;
vector<int> v;
int ans;
int n;
void solve()
{cin >> n;cin >> s;for(int i=0; i<n; i++){if(s[i]=='e'){v.push_back(i);}if(s[i]=='f'){for(auto j:v) ans+=i-j;}}cout << ans;
}
signed main()
{ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int t=1;
// cin >> t;while(t--) solve();return 0;
}
Problem G. 石 头 剪刀 布
题目链接: Problem - G - Codeforces

题意比较简单,就是两个人玩石头剪刀布,两个人的总牌数一样,小V赢一局就+1分,否则就-1分。输出分数最大和最小的情况。
要想赢的局数足够多就要尽量让石头-剪刀,布-石头,剪刀-布。如果有剩余的话就尽量出相同的,保证不会变负分。按照这样的大原则,参考具体牌的数量关系算出最多和最少的分数。
代码:
签到题,不说了
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int, int>
#define fi first
#define se second
const int N = 1e5+1;
int a[N];
string s,s1;
vector<int> v;
int ans;
int n;
int x,y,z;
void solve()
{int n,a1,b1,c1,a2,b2,c2,ans=0,res=0;cin>>n>>a1>>b1>>c1>>a2>>b2>>c2;int x1=a1,y1=b1,z1=c1,x2=a2,y2=b2,z2=c2;if(a1<b2){b2-=a1;ans+=a1;a1=0;}else{a1-=b2;ans+=b2;b2=0;if(a1>=a2){a1-=a2;a2=0;}else{a2-=a1;a1=0;}c2-=a1;ans-=a1;a1=0;}if(b1<c2){c2-=b1;ans+=b1;b1=0;}else{b1-=c2;ans+=c2;c2=0;if(b1>=b2){b1-=b2;b2=0;}else{b2-=b1;b1=0;}a2-=b1;ans-=b1;b1=0;}if(c1<a2){a2-=c1;ans+=c1;c1=0;}else{c1-=a2;ans+=a2;a2=0;if(c1>=c2){c1-=c2;c2=0;}else{c2-=c1;c1=0;}b2-=c1;ans-=c1;c1=0;}cout<<ans<<" ";if(x1<z2){z2-=x1;res+=x1;x1=0;}else{x1-=z2;res+=z2;z2=0;if(x1>=x2){x1-=x2;x2=0;}else{x2-=x1;x1=0;}y2-=x1;res-=x1;x1=0;}if(y1<x2){x2-=y1;res+=y1;y1=0;}else{y1-=x2;res+=x2;x2=0;if(y1>=y2){y1-=y2;y2=0;}else{y2-=y1;y1=0;}z2-=y1;res-=y1;y1=0;}if(z1<y2){y2-=z1;res+=z1;z1=0;}else{z1-=y2;res+=y2;y2=0;if(z1>=z2){z1-=z2;z2=0;}else{z2-=z1;z1=0;}x2-=z1;res-=z1;z1=0;}cout<<-1*res<<endl;
}
signed main()
{ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int t=1;cin>>t;while(t--) solve();return 0;
}
Problem J. 奇 偶 游 戏
题目链接: Problem - J - Codeforces

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int, int>
#define fi first
#define se second
const int N = 1e5+1;
int a[N];
string s,s1;
void solve()
{int n,m;cin>>n>>m;if(n%2==0){if(n>m)cout<<2<<endl;elsecout<<1<<endl;}else{if(n>m)cout<<1<<endl;elsecout<<2<<endl;}
}
signed main()
{ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int t=1;
// cin >> t;while(t--) solve();return 0;
}
Problem L.好矩阵
题目链接:Problem - L - Codeforces
题意就是计算有多少个m✖️n的01矩阵使得对于矩阵中的每一个元素,它所在的行和列的异或和等于它本身。
这个题如果数据量大的话就非常的不好验证,主要是找规律。根据题目的阳历可以发现当相加为偶数的时候就是2^(n+m)-2。最后一个打表可以发现他是n^455,结合前面的额2 5 是2^1次方可以得出如果两个数相加是奇数的话就是2^(num-1),其中num是偶数方。题中没有给出来的是当两个数都是偶数的时候只有一种情况。最后求次方的时候需要用到快速幂。
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int, int>
#define fi first
#define se second
#define mod 998244353
const int N = 1e5+1;
int a[N];
string s;
vector<int> v;
int ans;
int n,m;
int x,y,z;
int r1,s1,p1,r2,s2,p2;
int cnt;
int num;
int qpow(int b)
{int a=2;int k=1;while(b){if(b%2==1)k=k*a%mod;a=a*a%mod;b/=2;}return k;
}
void solve()
{cin >> n >> m;if((n+m)%2==0){if(n%2==0){cout << 1 << endl;return ;}else{num=n+m-2;}}else{if(n%2==0)num=n-1;else num=m-1;}cout << qpow(num) << endl;
}
/*
3
3 1 1 1 1 1 1
1 0 1 0 0 0 1
0 0 0 0 0 0 0
*/
signed main()
{ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int t=1;cin >> t;while(t--) solve();return 0;
}
好了,本次的补题就到这了~