B. Moamen and k-subarrays
对比数组和之前的不同,结构体。
#include<iostream>
#include<cstdio>
#include<string>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<map>
#include<vector>
using namespace std;
#define ll long long
#define lowbit(x) x&-x
#define N 1000005
//typedef __int128 ll;
typedef pair<int,int>pll;
struct node{
ll x;
ll biao;
}a[100005];
bool cmp(node p,node q){
return p.x<q.x;
}
signed main()
{
int T; cin>>T;
while(T--){
ll n,k; cin>>n>>k;
for(ll i=1;i<=n;i++){
cin>>a[i].x;
a[i].biao=i;
}
sort(a+1,a+1+n,cmp);
ll num=1;
for(ll i=2;i<=n;i++){
if(a[i].biao!=a[i-1].biao+1) num++;
}
if(num<=k) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
}
C. Moamen and XOR
位运算:&:同1则1->(累积)全都是1 则为1,否则为0
^:相同为0->(累计)偶数个1为0,否则为1
拆分成n个,k位数来看,同时看n个单独的位数。
n为奇:&>^:不成立;
&==^:每个位数上可以都是1,或者不全为1且有偶数个1
[ C ( n , 0 ) + C ( n , 2 ) + C ( n , 4 ) + … + C ( n , n − 1 ) + C ( n , n ) ] k [C(n,0)+C(n,2)+C(n,4)+…+C(n,n-1)+C(n,n) ]^{k} [C(n,0)+C(n,2)+C(n,4)+…+C(n,n−1)+C(n,n)]k= ( 2 n − 1 + 1 ) k (2^{n-1}+1)^{k} (2n−1+1)k
n为偶:&==^:每个位数上不全为1且有n个1
[ C ( n , 0 ) + C ( n , 2 ) + C ( n , 4 ) + . . . + C ( n , n − 2 ) ] k = ( 2 n − 1 − 1 ) k [C(n,0)+C(n,2)+C(n,4)+...+C(n,n-2)]^{k}=(2^{n-1}-1)^k [C(n,0)+C(n,2)+C(n,4)+...+C(n,n−2)]k=(2n−1−1)k
&>^:高位相等,当前位上全为1,低位任意取
i i i遍历0~k-1位数:
低位: [ C ( n , 0 ) + C ( n , 1 ) + . . . + C ( n , n ) ] = 2 n [C(n,0)+C(n,1)+...+C(n,n)]=2^n [C(n,0)+C(n,1)+...+C(n,n)]=2n
高位: 2 n − 1 − 1 2^{n-1}-1 2n−1−1
即: ( 2 n ) i + ( 2 n − 1 − 1 ) k − 1 − i (2^n)^i+(2^{n-1}-1)^{k-1-i} (2n)i+(2n−1−1)k−1−i
#include<iostream>
#include<cstdio>
#include<string>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<map>
#include<vector>
using namespace std;
#define ll long long
#define lowbit(x) x&-x
#define N 1000005
//typedef __int128 ll;
typedef pair<int,int>pll;
const int mod=1e9+7;
ll qpow(ll a,ll b)
{
ll ans=1;
while(b)
{
if(b&1)
ans=ans*a%mod;
a=a*a%mod;
b>>=1;
}
return ans;
}
signed main()
{
int T; cin>>T;
while(T--){
ll n,k; cin>>n>>k;
if(n%2==1) cout<<qpow(qpow(2,n-1)+1,k)<<endl;
else{
ll ans=qpow(qpow(2,n-1)-1,k);
ans%=mod;
for(ll i=0;i<k;i++){
ans=ans+((qpow((2,n),i))%mod+(qpow(qpow(2,n-1)-1,k-i-1))%mod);
ans%=mod;
}
ans%=mod;
cout<<ans<<endl;
}
}
}