A. 简单的分类讨论+基础数论
#include <bits/stdc++.h>
#define int long long
using namespace std;
int calc(int x, int y){
int mod = x%5;
if(mod == 0 && x>=1)
return 0;
int c1=INT_MAX, c2=INT_MAX;
if(x-mod >= 1)
c1 = mod;
int nowx = x+(5-mod);
if(nowx >= 1){
int tmp = 5-mod;
if(nowx > y)
tmp += nowx-y;
c2 = tmp;
}
return min(c1, c2);
}
signed main(){
ios_base::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
int T;
cin >> T;
while(T--){
int x, y;
cin >> x >> y;
cout << calc(x, y) << "\n";
}
return 0;
}
B. 字符串匹配
#include <bits/stdc++.h>
#define int long long
using namespace std;
int a[30];
signed main(){
ios_base::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
int T, n;
string str;
cin >> T;
while(T--){
cin >> n;
for(int i=1; i<=26; i++) cin >> a[i];
cin >> str;
if(n==1){
cout << (a[str[0]-'a'+1]==1 ? "Yes\n" : "No\n");
continue;
}
// char now = str[0];
int cnt = 1;
bool flg = 0;
for(int i=1; i<n;){
while(str[i]==str[i-1] && i<n){
i++;
cnt++;
}
if(i == n)
break;
if(str[i]!=str[i-1]){
// cout << cnt << "\n";
// cout << a[str[i-1]-'a'+1];
if(a[str[i-1]-'a'+1]==0 || cnt % a[str[i-1]-'a'+1] != 0){
cout << "No\n";
flg = 1;
break;
}
else{
cnt = 1;
i++;
}
}
}
// cout << a[str[n-1]-'a'+1];
// cout << cnt;
if(!flg && a[str[n-1]-'a'+1]==0){
cout << "No\n";
flg = 1;
continue;
}
if(!flg && cnt % a[str[n-1]-'a'+1] != 0){
cout << "No\n";
flg = 1;
continue;
}
if(!flg)
cout << "Yes\n";
}
return 0;
}
C. 规律+优先队列
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int maxn = 2e5+5;
#define PII pair<int,int>
int id[maxn];
priority_queue<PII, vector<PII>, greater<PII>> pq1, pq2;
signed main(){
ios_base::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
int k, n;
cin >> n >> k;
for(int i=1; i<=n; i++){
int x;
cin >> x;
// cout << (x^k) << " ";
pq1.push({x,i}), pq2.push({(x^k),i});
}
if(n==1){
int x = pq1.top().first;
cout << x << "\n";
return 0;
}
int cnt = 1;
while(cnt != n){
if(cnt%2){
auto x = pq2.top();
// cout << x.first<<" ";
while(id[x.second] == 1){
pq2.pop();
x = pq2.top();
// cout << x.first<<" ";
}
pq2.pop();
id[x.second] = 1;
}
else{
auto x = pq1.top();
// cout << x.first<<" ";
while(id[x.second] == 1){
pq1.pop();
x = pq1.top();
// cout << x.first<<" ";
}
pq1.pop();
id[x.second] = 1;
}
cnt++;
// cout << pq1.size() << " "<< pq2.size() << "\n";
}
if(n % 2 == 1){
while(!pq1.empty()){
auto x = pq1.top();
if(id[x.second] == 0){
cout << x.first << "\n";
break;
}
pq1.pop();
}
}
else{
while(!pq2.empty()){
auto x = pq2.top();
if(id[x.second] == 0){
cout << x.first << "\n";
break;
}
pq2.pop();
}
}
return 0;
}
D. dfs+数论 (Medium)
/*
无限循环小数的性质:
分母为1的情况下,分子只需要含有k的质因数之外的质因子即可
*/
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int maxn = 2e5+5;
vector<int> prime_factor;
set<int> ans; // 使q/i为有限小数的方案i的个数
int p, q, k;
void dfs(int fac, int level){
if(fac > q)
return;
if(level == 0)
ans.insert(fac);
if(level == prime_factor.size())
return;
// 找到所有形如:i=d*(2^a)*(3^b)*... <= q的数,其中d|p,且因子为k的质因数
while(fac <= q){
dfs(fac, level+1);
if(prime_factor[level] > 1e18/fac)
break;
fac *= prime_factor[level];
if(fac <= q)
ans.insert(fac);
}
}
signed main() {
ios_base::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> p >> q >> k;
int id = sqrt(k);
for(int i=2; i<=id; i++){
if(k%i == 0){
prime_factor.push_back(i);
while(k%i == 0)
k /= i;
}
}
if(k > 1)
prime_factor.push_back(k);
id = sqrt(p);
for(int i=1; i<=id; i++){
if(p%i == 0){
dfs(i, 0);
if(i != p/i)
dfs(p/i, 0);
}
}
cout << q - ans.size() << "\n";
return 0;
}