给你一段01字符串,要求每个大于等于2的字串中,1的个数要大于等于0的个数,可以在任何位置插入1,问最少插入多少个1使要求成立
#include
using namespace std;
const int N = 1e6+7;
typedef long long ll;
ll n,A[N];
string s;
int main(){
int T;
cin>>T;
while(T--){
cin>>n>>s;
int cnt1=0,cnt2 = 0;
for(int i = 1;i<n;i++){
if(s[i]=='0'&&s[i-1]=='0')cnt1+=2;
else if(i>=2&&s[i]=='0'&&s[i-1]=='1'&&s[i-2]=='0')cnt1++;
}
cout<<cnt1<<endl;
}
return 0;
}
定义一种排列(P1,P2,P3,Pn)时漂亮的,gcd(1⋅P1,2⋅P2,…,n⋅Pn) > 1,问给定的n有多少种不同的排列
显然,让gcd(1⋅P1,2⋅P2,…,n⋅Pn) > 1最简单的方式就是让每个数都是偶数,最后的gcd为2,就是说让每个奇数都乘上一个偶数
#include
using namespace std;
const int N = 1e6+7;
typedef long long ll;
ll n,A[N]={1};
string s;
ll mod = 998244353;
int main(){
int T;
cin>>T;
for(int i = 1;i<=1000;i++){ // 预处理阶乘
A[i] = A[i-1]*i%mod;
}
while(T--){
cin>>n;
if(n%2==1) cout<<"0\n";
else {
long long ans = A[n/2]*A[n/2]%mod;
cout<<ans<<endl;
}
}
return 0;
}
定义一个排列的power , 前面的最大值会覆盖后面比它小的值,power就是这个数组的不同数字的多少,(我也说得不清楚), 例如 {2,1,4,5,3} 形成的数组为{2,2,4,5,5} ,所以power为 5
{4,3,1,5,2} 形成数组为{4,4,4,5,5} power 为 2
定义第 i 位置数组滑动,数组从 p=[p1,p2,…,pn] 变成p=[pn−i+1,…,pn,p1,p2,…,pn−i].
问给出1~n位置数组滑动后的power 值,是否存在一种初始排列成立
首先 判断是否只有一个1 ,不是输出NO
然后 从1开始遍历,遍历到末尾再从头遍历到1 ,比较后者与前者的大小,当后者大于前者并且两者相差2以上则输出NO
#include
using namespace std;
const int N = 1e6+7;
typedef long long ll;
ll n,A[N]={1};
string s;
ll mod = 998244353;
int main(){
int T;
cin>>T;
while(T--){
cin>>n;
int ix = -1;
int pre = 1,ok=1;
int kk = 0;
for(int i = 0;i<n;i++){
cin>>A[i];
if(A[i]==1) kk++,ix = i;
}
if(kk!=1) ok = 0;
for(int i = ix;i<n;i++){
if(A[i]>pre&&A[i]-pre>1) ok = 0;
pre = A[i];
}
for(int i = 0;i<=ix;i++){
if(A[i]>pre&&A[i]-pre>1) ok = 0;
pre = A[i];
}
if(ok)cout<<"YES\n";
else cout<<"NO\n";
}
return 0;
}
给定排列范围为l~r,长度为r-l+1,你可以选一个数x,对所有该排列的数异或x,得到一个新的数组,问你已经得到了异或后的数组,输出一个合法的x。
首先看对一个排列都异或上一个数的性质,对于二进制中每一位来说,异或上1会使该位进行翻转,那对全部的数异或上1时,那么这一位的1和0的数量就会交换
所以我们只需把初始排列,和最终的排列每一位1的数量记录下来,每一位进行比较,如果说有某一位上初始排列上的1数量与最终排列上的1不同,在最后的答案中该位为1,否则为 0
#include
using namespace std;
const int N = 1e6+7;
typedef long long ll;
ll n;
ll A[N],B[N];
ll bit[N],bit2[N];
void slove(){
ll l,r;
cin>>l>>r;
for(int i = 0;i<=r;i++){
cin>>B[i];
for(int j = 0;j<30;j++){
if(B[i]>>j&1) bit2[j]++;
if(i>>j&1) bit[j]++;
}
}
ll ans = 0;
for(int i = 0;i<30;i++){
if(bit[i]!=bit2[i]) ans += (1<<i);
bit[i] = bit2[i] = 0;
}
cout<<ans<<endl;
}
int main(){
int T;
cin>>T;
while(T--){
slove();
}
return 0;
}