题解:CF2264D Dr. Agos's Dark Mode
搞笑题,但是我 vp 的时候用人脑做,做了半个小时意识到可以打表,过完 D 只剩五分钟了,这波唐了。
注意到只有
:::success[code]
namespace my{
const int N=2e5+5,inf=1000000000;template<typename T>pref T Min(T x,T y){return x<y?x:y;}template<typename T>pref T Max(T x,T y){return x>y?x:y;}template<typename T>pref T Abs(T x){return x<0?-x:x;}
int n,pw[N];
int a[N],b[N],mn=inf;
pref void init(){
pw[0]=1;up(i,1,N-1)pw[i]=(pw[i-1]+pw[i-1])%3;
}
pref int f(){
int ret=0;
up(r,1,n){
int sum=0;
dn(i,r,1){
sum=(sum+a[i]*pw[r-i])%3;
if(sum==0)ret++;
}
}
return ret;
}
pref void dfs(int x,int t){
if(x>n){
int k=f();
if(k<=mn){
up(i,1,n)b[i]=a[i];
mn=k;
}
return ;
}
if(t==3)a[x]=0,dfs(x+1,t);
else {
a[x]=0;
dfs(x+1,t);
a[x]=1;
dfs(x+1,t+1);
a[x]=0;
}
}
pref void SOLVE(){
for(n=7;n<=50;n++){
mn=inf,dfs(1,0);
up(i,1,n)if(b[i])cout<<i<<' ';
cout<<'\n';
}
}
}
:::
为了方便,我找的是字典序最大的。
输出是。
1 4 6
1 4 6
1 4 6
1 5 9
1 5 9
1 5 9
1 6 10
1 6 10
1 6 10
1 7 13
1 7 13
1 7 13
1 8 14
1 8 14
1 8 14
1 9 17
1 9 17
1 9 17
1 10 18
1 10 18
1 10 18
1 11 21
1 11 21
1 11 21
1 12 22
1 12 22
1 12 22
1 13 25
1 13 25
1 13 25
1 14 26
1 14 26
1 14 26
1 15 29
1 15 29
1 15 29
1 16 30
1 16 30
1 16 30
1 17 33
1 17 33
1 17 33
1 18 34
1 18 34
注意到三个三个是一样的,每三个之间的差有两种方式交替,分别是 +0 +1 +1 和 +0 +1 +3 两种,直接带着地推就行了。其实应该有式子,但是我非常地愚蠢。
容易发现这个结论其实就是让这三个一尽量平均的分布。
这个东西感性理解是对的。
稍微严谨一点。
你发现含有一个
:::success[code]
namespace my{
const int N=2e5+5,inf=1000000000;template<typename T>pref T Min(T x,T y){return x<y?x:y;}template<typename T>pref T Max(T x,T y){return x>y?x:y;}template<typename T>pref T Abs(T x){return x<0?-x:x;}
int a[N][2];
pref void init(){
a[7][0]=4,a[7][1]=6;
for(int i=7;i<=N-1;i+=6){
a[i+1][0]=a[i+2][0]=a[i][0];
a[i+1][1]=a[i+2][1]=a[i][1];
a[i+3][0]=a[i+1][0]+1;
a[i+3][1]=a[i+1][1]+3;
a[i+4][0]=a[i+5][0]=a[i+3][0];
a[i+4][1]=a[i+5][1]=a[i+3][1];
a[i+6][0]=a[i+4][0]+1;
a[i+6][1]=a[i+4][1]+1;
}
}
pref void SOLVE(){
int n;cin>>n;
if(n==1)return cout<<"1\n",void();
if(n==2)return cout<<"11\n",void();
if(n==3)return cout<<"101\n",void();
if(n==4)return cout<<"1010\n",void();
if(n==5)return cout<<"10101\n",void();
if(n==6)return cout<<"101010\n",void();
cout<<"1";
up(i,2,n){
if(i==a[n][0])cout<<"1";
else if(i==a[n][1])cout<<"1";
else cout<<"0";
}
cout<<'\n';
}
}
:::