B 取模 模拟 找规律

cpp
void solve(){
int n,m;cin>>n>>m;
vector<int>a(n+1);
forr(i,1,n){
cin>>a[i];
}
// forr(i,1,n)cout<<(a[i]+i)%m<<' ';cout<<endl;
int fg=0;
forr(i,1,n)if((a[i]+i)%m==0){
fg=1;
break;
}
if(!fg)yes;
else{
/*
注意时机 每秒末移动 每秒初判定 所以要想前进 相邻两格在这一秒都不能为0
如果数组的一段总会有一个(a_i+x)%m=0 那这一段一定过不去
得出结论 连续相同的数 长度>=m 那这一段每秒都一定有一个障碍 过不去
*/
int len=1,mx=0;
forr(i,2,n){
if(a[i]!=a[i-1])mx=max(mx,len),len=1;
else len++;
}
mx=max(mx,len);
// cout<<mx<<endl;
if(mx>=m)no;
else yes;
}
}
C 思维 数学

用所有的拼块,不能重叠: p + 2 q = n ( m + 1 ) + m ( n + 1 ) p+2q=n(m+1)+m(n+1) p+2q=n(m+1)+m(n+1)
L型的有一横一竖,线段可横可竖,横竖边分别满足
- 所有横边 H = m ( n + 1 ) = p h + q H=m(n+1)=p_h+q H=m(n+1)=ph+q
- 所有纵边 V = n ( m + 1 ) = p v + q V=n(m+1)=p_v+q V=n(m+1)=pv+q
H − V = p h − p v = m − n H-V=p_h-p_v=m-n H−V=ph−pv=m−n
柯西定理 ∣ p h − p v ∣ = ∣ m − n ∣ ≤ p h + p v = p |p_h-p_v|=|m-n|\leq p_h+p_v=p ∣ph−pv∣=∣m−n∣≤ph+pv=p
凑数:
p + 2 q = n ( m + 1 ) + m ( n + 1 ) = 2 m n + n + m p+2q=n(m+1)+m(n+1)=2mn+n+m p+2q=n(m+1)+m(n+1)=2mn+n+m
令 t = p + 2 q t=p+2q t=p+2q
t = 2 m n + n + m t=2mn+n+m t=2mn+n+m
2 t + 1 = 4 m n + 2 n + 2 m + 1 = ( 2 n + 1 ) ( 2 m + 1 ) 2t+1=4mn+2n+2m+1=(2n+1)(2m+1) 2t+1=4mn+2n+2m+1=(2n+1)(2m+1)分解为两个奇数
cpp
void solve(){
int p,q;cin>>p>>q;
int t=p+2*q;
int sm=2*t+1,sq=sqrt(sm);
int n,m;
// cout<<"ans";
for(int a=1;a<=sq;a+=2){
if(sm%a==0){
int b=sm/a;
n=(a-1)/2,m=(b-1)/2;
if(n*(m+1)+m*(n+1)==p+2*q&&abs(n-m)<=p){
return cout<<n<<' '<<m<<endl,void();
}
}
}
cout<<-1<<endl;
}
D 二分 交互题 对答案的奇偶性贡献规律
cpp
bool ask(int l,int r){
cout<<"? "<<r-l+1<<' ';
forr(i,l,r)cout<<i<<' ';cout<<endl;
fls;
int ans;
cin>>ans;
return ((ans^(r-l+1))&1);
}
int ask(int l,int r,int p){
cout<<"? "<<r-l+2<<' '<<p<<' ';
forr(i,l,r)cout<<i<<' ';cout<<endl;
fls;
int ans;
cin>>ans;
return ((ans^(r-l+2))&1);
}
void solve(){
int n;cin>>n;
int l=1,r=2*n+1;
/*
询问部分的数 有三种情况
出现次数cnt=1 对询问长度贡献1 对答案贡献1
cnt=2 +2 +0
cnt=3 +3 +0
发现要找的cnt=3 对询问长度和答案的贡献 奇偶性不同
所以询问长度和得到回答 奇偶性不同 询问中包含cnt=3部分
找cnt=3 右左中三点 3*log(1e3)=10 <=33
*/
// 找包含cnt=3的右端
int rp;
while (l<=r)
{
int mid=(l+r)>>1;
if(ask(1,mid))rp=mid,r=mid-1;// 奇偶性不同 包含cnt=3
else l=mid+1;
}
// 左端
int lp;
l=1,r=rp;
while (l<=r)
{
int mid=(l+r)>>1;
if(ask(mid,rp))lp=mid,l=mid+1;
else r=mid-1;;
}
// 中间
int mp;
l=lp+1,r=rp;
while (l<=r)
{
int mid=(l+r)>>1;
if(ask(mid,rp,lp))mp=mid,l=mid+1;
else r=mid-1;
}
cout<<"! "<<lp<<' '<<mp<<' '<<rp<<endl;
}
