CF-937
在补题......
D
分析
我们发现这些因子都是二进制形式的十进制数,n的范围是1e5,16的二进制是10000,于是可以枚举1~16,把这些因子预处理出来,对于每个n就枚举因子再作除,看剩下的数每位是不是只有0与1
代码
c++
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long long
#define db(x) cout<<x<<" "<<endl;
#define _db(a,n) for(int i=1;i<=n;i++) cout<<a[i]<<" ";cout<<endl;
#define mem(a) memset(a,0, sizeof(a))
#define rep(i,l,r) for(int i=l;i<=r;i++)
#define per(i,r,l) for(int i=r;i>=l;i--)
int s[16],b[33];
void solve(){
int n;cin>>n;
int tp=n,f=0;
while(tp){
if(tp%10>1) f=1;
tp/=10;
}
if(f){
rep(i,2,16){
while(n%b[i]==0){
n/=b[i];
}
}
int tp=n,ff=1;
while(tp){
if(tp%10>1) ff=0;
tp/=10;
}
if(ff) cout<<"YES";
else cout<<"NO";
}
else cout<<"YES";
cout<<endl;
}
signed main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int e=0;
rep(i,1,32){//预处理因子
if(i&1){
int x=i,res=0,k=0;
while(x){
s[k++]=x%2;
x/=2;
}
per(j,k,0){
res=res*10+s[j];
}
b[++e]=res;
}
}
int t;cin>>t;while(t--)
solve();
return 0;
}
E
分析
因为所求长度一定是n的因子,我们可以暴力枚举长度len,再对遍历每个区间判断就行
操作
蒟蒻之前只会嵌套for循环把每个枚举到的对应区间取出来再遍历判断😢
难点在于如何简单的实现这个**"周期性区间映射"**
如s=hshahaha,len为2,且我们要映射到第一个长为len的区间,即要得到这样的映射关系:s\[0\]-s\[2\],s\[1\]-s\[3\],s\[0\]-s\[4\],s\[1\]-s\[5\],s\[0\]-s\[6\],s\[1\]-s\[7\]
我们可以简化为一个序列,已知序列a\[\],设周期T,所选的一个周期长度的区间起点为st,用i枚举序列每一个数
则所求映射为 : a\[i\]-a\[i%T+s\]
c++
rep(i,0,7) a[i]=i;
int T,st;cin>>T>>st;//周期长度与映射区间的起点
for(int i=0;i<=7;i++){
cout<<a[i]<<"-"<<a[i%T+st]<<endl;
}
/*
2 2
0--2
1--3
2--2
3--3
4--2
5--3
6--2
7--3
*/
代码
c++
void solve(){
int n;cin>>n;
string s;cin>>s;
for(int len=1;len<=n;len++){
if(n%len!=0) continue;
for(int st=0;st<=len&&st<n;st+=len){//枚举起点,即第一个区间与第二个区间的起点
int sum=0;
rep(j,0,n-1){
sum+=(s[j]!=s[j%len+st]);
}
if(sum<=1){
cout<<len<<endl;
return;
}
}
}
}
F
c++
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long long
#define db(x) cout<<x<<" "<<endl;
#define _db(a,n) for(int i=1;i<=n;i++) cout<<a[i]<<" ";cout<<endl;
#define mem(a) memset(a,0, sizeof(a))
#define rep(i,l,r) for(int i=l;i<=r;i++)
#define per(i,r,l) for(int i=r;i>=l;i--)
void solve(){
int a,b,c;cin>>a>>b>>c;
if(c-a!=1){
cout<<"-1"<<endl;
return;
}
int x=0;
queue<int>q;
q.push(0);
while(q.size()){
x=q.front();
q.pop();
if(a){
a--;
q.push(x+1);
q.push(x+1);
}
else if(b){
b--;
q.push(x+1);
}
}
cout<<x<<endl;
}
signed main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t;cin>>t;while(t--)
solve();
return 0;
}