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循环把每个枚举到的对应区间取出来再遍历判断
标签:int,CF,tp,--,while,len,937,define From: https://www.cnblogs.com/mono-4/p/18113700