参考代码放在最后面。
思路
A.模糊匹配
按照题意直接替换后比较即可。
B.只留专一数
由于幂运算不会影响质因数个数,所以我们可以将操作视作删除 ,所以只需找到原数组是否存在质因数个数
的数即可。
C.左右左右左左右,左右左左右
考虑贪心,每步保证最优,即只需满足 最小化即可。
所以可以枚举下一步插入 或者
进行枚举,取最优即可。
D.进退的艺术
由于序列顺序不会影响结果,所以可以进行排序,然后考虑贡献组成即可:(设当前为 索引)
- 满足
,我们可以用二分找出
的数量,然后加上对应数量的
即可。
- 否则,我们需要得出所有满足条件
的和,然后减去即可。
上面两步都可以通过排序后容易得出,二分出对应位置,得出其对应后缀和
特别需要讨论的是: 时,需要考虑两种情况下分别处理。
时间复杂度为
E.扫雷难度调节
首先考虑什么情况下数字数量是最大化的。
当一个雷周围八格都是非雷时,数字数量是最大化的。
所以
是最优的,此时只需考虑 和
的情况即可。(因为没有足够的空间容纳下一个
模块中的
。)
于是考虑把剩余部分也填充雷,即 。
如果数字多了,直接改成 即可。
F.徽章计数
记 表示
的数量。
特判无解情况:
无法被
整除。
- 徽章种类不足,即
。
考虑贡献拆分,拆分成从 种徽章中选
种徽章的方案数和选
种特定徽章下分配的数量。
前者很好算,直接 即可。
后者我们需要对于每一个 计算
个小朋友分配
种徽章下不同的方案数,由于前者已经全排列了颜色情况,所以对应需要除去
用于去重,所以公式为
时间复杂度度为 到
。
代码
A.模糊匹配
void solve(){
int n;
cin >> n;
string a,b;
cin >> a >> b;
for (auto &ch : a){
if (ch == 'I' || ch == 'l' || ch == '1') ch = 'I';
if (ch == 'O' || ch == '0') ch = '0';
}
for (auto &ch : b){
if (ch == 'I' || ch == 'l' || ch == '1') ch = 'I';
if (ch == 'O' || ch == '0') ch = '0';
}
cout << (a == b ? "YES\n" : "NO\n");
}
B.只留专一数
namespace Prime{
std::vector<int> cnt;
std::vector<bool> np;
constexpr int N = 1e3+7;
void Eratosthenes(){
for (int i = 2;i < N;i ++){
if (np[i]) continue;
for (int j = i<<1;j < N;j += i) {
np[j] = 1;
cnt[j]++;
}
}
}
void init(){
np.resize(N);
cnt.resize(N);
np[0] = np[1] = 1;
cnt[0] = cnt[1] = 0;
Eratosthenes();
}
}
using Prime::cnt;
void solve(){
int n;
cin >> n;
vector<int> a(n+1);
for (int i = 1;i <= n;i++) cin >> a[i];
bool flag = 0;
for (int i = 1;i <= n;i++) {
if (cnt[a[i]] <= 1) flag = 1;
}
cout << (flag ? "YES\n" : "NO\n");
}
C.左右左右左左右,左右左左右
using i64 = long long;
void solve(){
i64 n,a,b;
cin >> n >> a >> b;
p64 cnt = {0,0};
for (int i = 1;i <= n;i++){
i64 x = cnt[0] * b,y = cnt[1] * a;
if (abs(x+b-y) <= abs(y+a-x)) cout << "0",cnt[0]++;
else cout << "1",cnt[1]++;
}
cout << '\n';
}
D.进退的艺术
using i64 = long long;
using p64 = array<i64,2>;
void solve(){
int n,m;
cin >> n >> m;
vector<p64> a(n+1);
vector<i64> c(n+1);
for (int i = 1;i <= n;i++){
a[i][1] = i;
cin >> a[i][0];
}
sort(a.begin()+1,a.end());
vector<i64> b(n+1),suf(n+2);
for (int i = 1;i <= n;i++) b[i] = a[i][0];
for (int i = n;i > 0;i--) suf[i] += suf[i+1] + b[i];
for (int i = 1;i <= n;i++){
int j = upper_bound(b.begin()+1,b.end(),m-b[i]) - b.begin();
if (i < j) {
c[i] -= suf[j];
c[i] += i64(j-2) * b[i];
} else {
c[i] -= suf[j] - b[i];
c[i] += i64(j-1) * b[i];
}
}
for (int i = 1;i <= n;i++) {
a[i][0] = c[i];
}
sort(a.begin()+1,a.end(),[](p64 x,p64 y)->bool {
return x[1] < y[1];
});
for (int i = 1;i <= n;i++) {
cout << a[i][0] << " \n"[i==n];
}
}
E.扫雷难度调节
void solve(){
int n,m,k;
cin >> n >> m >> k;
vector<vector<bool>> vis(n+1,vector<bool>(m+1));
bool flag = 1;
int cnt = n*m;
for (int i = 2;i <= n;i += 3){
for (int j = 2;j <= m;j += 3){
vis[i][j] = 1;
cnt--;
}
}
if (n % 3 == 1){
for (int j = 2;j <= m;j += 3){
vis[n][j] = 1;
cnt--;
}
}
if (m % 3 == 1){
for (int i = 2;i <= n;i += 3){
vis[i][m] = 1;
cnt--;
}
}
if (n%3 == 1 && m%3 == 1){
cnt--;
vis[n][m] = 1;
}
if (cnt < k) flag = 0;
else {
for (int i = 1;i <= n;i++){
for (int j = 1;j <= m;j++){
if (vis[i][j]) continue;
if (cnt > k) {
cnt--;
vis[i][j] = 1;
}
}
}
}
if (flag){
for (int i = 1;i <= n;i++) {
for (int j = 1;j <= m;j++){
cout << vis[i][j];
}
cout << "\n";
}
} else {
cout << -1 << "\n";
}
}
F.徽章计数
void solve(){
int n,m;
cin >> n >> m;
vector<int> cnt(n+1),a(n+1),tot(n+1);
int req = 0;
Z ans = 1;
for (int i = 1;i <= n;i++){
cin >> a[i];
cnt[a[i]]++;
tot[a[i]]++;
if (cnt[a[i]] == a[i]) {
cnt[a[i]] = 0;
req ++;
}
}
for (int i = 1;i <= n;i++) {
if (cnt[i] > 0) {
cout << 0 << "\n";
return;
}
}
if (req > m){
cout << 0 << "\n";
return;
}
for (int i = 0;i < req;i++) ans *= m-i;
for (int i = 1;i <= n;i++){
if (tot[i] == 0) continue;
int col = tot[i] / i;
Z res = comb.A(tot[i],tot[i]);
for (int j = 1;j <= col;j++){
res *= comb.inv[i];
}
res /= comb.A(col,col);
ans *= res;
}
cout << ans << "\n";
}
模版
取模类与组合数
template <long long MOD>
struct ModInt{
long long val = 0;
ModInt(long long x = 0):val(norm(x)){}
long long operator()(){ return val; }
constexpr ModInt operator-() const {
return ModInt(MOD - val);
}
constexpr ModInt operator~() const {
assert(val != 0);
return Pow(val,MOD-2);
}
constexpr ModInt& operator+=(ModInt x){
return val += x(),val = norm(val),*this;
}
constexpr ModInt& operator-=(ModInt x){
return val -= x(),val = norm(val),*this;
}
constexpr ModInt& operator*=(ModInt x){
return val *= x(),val = norm(val),*this;
}
constexpr ModInt& operator/=(ModInt x){
return val *= (~x)(),val = norm(val),*this;
}
constexpr ModInt& operator^=(long long y){
return val = Pow(*this,y)(),*this;
}
constexpr ModInt& operator++(){
return val ++,val = norm(val),*this;
}
constexpr ModInt operator++(int){
ModInt v = *this;
return val ++,val = norm(val),v;
}
constexpr ModInt& operator--(){
return val --,val = norm(val),*this;
}
constexpr ModInt operator--(int){
ModInt v = *this;
return val --,val = norm(val),v;
}
constexpr friend ModInt operator+(ModInt x, ModInt y){
return x += y;
}
constexpr friend ModInt operator-(ModInt x, ModInt y){
return x -= y;
}
constexpr friend ModInt operator*(ModInt x, ModInt y){
return x *= y;
}
constexpr friend ModInt operator/(ModInt x, ModInt y){
return x /= y;
}
constexpr friend ModInt operator^(ModInt x, long long y){
return x ^= y;
}
constexpr friend std::ostream& operator<<(std::ostream& os,ModInt x){
return os << x();
}
constexpr friend std::istream& operator>>(std::istream& is,ModInt &x){
is >> x.val, x.val = norm(x.val);
return is;
}
constexpr static long long norm(long long x){
return x < 0 ? (x % MOD + MOD) % MOD : x % MOD;
}
constexpr static ModInt Pow(ModInt x,long long y){
ModInt ans = 1;
for (;y; y >>= 1,x *= x)
if (y & 1) ans *= x;
return ans;
}
};
template <long long MOD>
struct Combination{
int siz = 0;
using Z = ModInt<MOD>;
std::vector<Z> fact,inv;
Combination():siz(1),fact(1,1),inv(1,1){}
void expend(int size){
if (siz >= size) return;
fact.resize(size),inv.resize(size);
for (int i = siz;i < size;i++) fact[i] = fact[i-1] * i;
inv[size-1] = 1 / fact[size-1];
for (int i = size - 2;i >= siz;i--) inv[i] = inv[i+1] * (i+1);
siz = size;
}
void check(int size){
if (siz >= size) return;
int n = siz;
while(n < size) n <<= 1;
n = std::min<unsigned int>(n,MOD);
expend(n);
}
Z A(int n,int m){
if (n < 0 || m < 0 || n < m) return 0;
check(n+1);
return fact[n]*fact[n-m];
}
Z C(int n,int m){
if (n < 0 || m < 0 || n < m) return 0;
if (n < MOD && m < MOD) {
check(n+1);
return fact[n] * inv[m] * inv[n - m];
} else return C(n/MOD,m/MOD)*C(n%MOD,m%MOD);
}
};
Combination<i64(1e9+7)> comb;
using Z = ModInt<i64(1e9+7)>;
主程序
#include<bits/stdc++.h>
#if __has_include("tool/local.hpp")
#include "tool/local.hpp"
#include "grader.hpp"
#else
#define Testcases(T) while(T--) solve();
#ifndef ONLINE_JUDGE
#define listen(...) freopen("data.in","r",stdin),freopen("data.out","w",stdout);
#else
#define listen(...)
#endif
#endif
using namespace std;
// Base type
using ll = long long;
using ld = long double;
using i64 = long long;
using f128 = long double;
using u64 = unsigned long long;
using p32 = std::array<int,2>;
using p64 = std::array<i64,2>;
// mt19937_64 rnd(time(0));
void solve(){
}
signed main(){
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr),std::cout.tie(nullptr);
listen(_TIMER,_FILE,_CHECKER);
int T = 1;
std::cin >> T;
Testcases(T);
return 0;
}
/*
| Code By Kendieer
| Model Updated : 2025/12/09
| Code With VSCode
*/

京公网安备 11010502036488号