CF-937(D,E)

CF-937

在补题……

D

分析

我们发现这些因子都是二进制形式的十进制数,n的范围是1e5,16的二进制是10000,于是可以枚举1~16,把这些因子预处理出来,对于每个n就枚举因子再作除,看剩下的数每位是不是只有0与1

代码

#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]$

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
*/

代码

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

#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;
}
posted @ 2024-04-03 23:11  mono_4  阅读(9)  评论(0编辑  收藏  举报