A. Shohag Loves Mod
翻译:
Shohag 有一个整数 n。请帮他找出一个递增整数序列 ,使得 在所有 的对上都满足。
可以证明,在给定的约束条件下,这样的序列总是存在的。
思路:
每个数为下标i*2-1(注意这里下标i从1开始),这样每个数取余得到的是下标i-1必定不同,且当i=50时,a_{i}为99在范围内符合条件。
实现:
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
// using pll = pair<ll,ll>;void solve(){ll n; cin>>n;for (int i=1;i<=n;i++){if (i!=1) cout<<" ";cout<<2*i-1;}cout<<endl;
}
int main(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);// 中间填保留几位小数,不填默认// cout.precision();ll t;cin>>t;while (t--) solve();}
B. Shohag Loves Strings
翻译:
对于字符串p,令f(p)为p不同非空子串的数量。
Shohag有一个字符串s。帮他找到一个s的非空子字符串p并且f(p)为偶数或者声明不存在这样的子字符串。
思路:
什么样的字符串符合条件?
两个连续的字符aa,f(aa)=2;两个不同的ab为f(ab)=3。
三个字符互不相同abc,f(abc)=6;除中间外都相同aba,f(aba)=5。
四个字符时,能否在三个字符不行时行,加中间的字符abab,f(abab)=7;
综上:当存在两个连续字符或三个互不相同字符时,为解。
实现:
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
// using pll = pair<ll,ll>;void solve(){string s;cin>>s;int n = s.size();for (int i=0;i<n;i++){if (i!=0 && i!=n-1){if (s[i]!=s[i-1] && s[i]!= s[i+1] && s[i-1]!=s[i+1]){cout<<s.substr(i-1,3)<<endl;return;}}if (i!=n-1){if (s[i]==s[i+1]){cout<<s.substr(i,2)<<endl;return;}}} cout<<-1<<endl;
}
int main(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);// 中间填保留几位小数,不填默认// cout.precision();ll t;cin>>t;while (t--) solve();}
C1. Shohag Loves XOR (Easy Version)
翻译:
Shohag有两个整数x和m。帮他统计整数y()的数量,y要如下且是x,y或两者的因子。
思路:
设a为x的二进制最高位,b为y的二进制最高位。
1.当a<b时:,要成为p的倍数范围要在明显x,y都达不到。
2.当a>b时:,要成为p的倍数范围要在明显x,y都达不到。
综上暴力遍历范围即可。
实现:
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
// using pll = pair<ll,ll>;void solve(){ll x,m,ans = 0; cin>>x>>m;ll tmp = x,cnt = 0;while (tmp){tmp/=2;cnt++;}// cout<<"-----"<<cnt<<endl;// cout<<" ---- "<<(ll)pow(2,cnt-1)<<endl;for (ll y=(ll)pow(2,cnt-1);y<min((ll)pow(2,cnt),m+1);y++){if (x==y) continue;ll xy = x^y;if (y%xy==0 || x%xy==0){ans++;}}cout<<ans<<endl;
}
int main(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);// 中间填保留几位小数,不填默认// cout.precision();ll t;cin>>t;while (t--) solve();}
C2. Shohag Loves XOR (Hard Version)
翻译:
Shohag有两个整数x和m。帮他统计整数y()的数量,y要如下可被x,y或两者整除。
思路:
分三种情况讨论:
- x^y可被x整除
- 令p=x^y => y=x^p,问题也就变为求能被x整除且。
- 又易得,可由异或性质得出
- 当,p的数量为
- 当且得,在此找x的倍数即可。
- x^y可被y整除
- 当y>x时,x^y<y+y=2y。而y的最小倍数也要2y,所以不可能。
- 从1遍历到min(m,x)即可。
- x^y可被x和y整除
- 当时,x^y>lcm(x,y)>=2*max(x,y);而x^y<2*max(x,y),不可能。
- 只有当x=y时,符合条件
答案为情况1+情况2-情况3
代码:
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
// using pll = pair<ll,ll>;void solve(){ll x,m,ans=0;cin>>x>>m; // case 1 ll p = m-m%x; ans = p/x-(p>x);if ((x ^ p) >= 1 and (x ^ p) <= m) ans++;p += x;if ((x ^ p) >= 1 and (x ^ p) <= m) ans++;// case 2for (ll y=1;y<=min(x,m);y++){if ((y^x)%y==0) ans++;}// case 3if (x<=m) ans--;cout<<ans<<endl;
}
int main(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);// 中间填保留几位小数,不填默认// cout.precision();ll t;cin>>t;while (t--) solve();}
D. Shohag Loves GCD
翻译:
Shohag有一个整数 n 和一个由 m 个唯一整数组成的集合 S。请帮他找出一个字典序上最大的整数数组 ,使得每个 1≤i≤n 的数组 ai∈S,并且在所有 1≤i<j≤n 的数组对中满足 ,或者指出不存在这样的数组。
思路:
贪心,令当前位置i下标的所有倍数上的数都比当前位置的值小一位。可满足。
代码:
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
// using pll = pair<ll,ll>;
vector<ll> S(1e5+10);
void solve(){ll n,m;cin>>n>>m;for (int i=1;i<=m;i++){cin>>S[i];}vector<ll> ans(n+1,m-1);ans[1] = m;for (int i=2;i<=n;i++){if (ans[i]<1){cout<<-1<<endl;return;}for (int j=i*2;j<=n;j+=i){ans[j] = ans[i]-1;}}for (int i=1;i<=n;i++){if (i!=1) cout<<" ";cout<<S[ans[i]];}cout<<endl;
}
int main(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);// 中间填保留几位小数,不填默认// cout.precision();ll t;cin>>t;while (t--) solve();}