Codeforces Round #737 (Div. 2)

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,n1)+C(n,n)]k= ( 2 n − 1 + 1 ) k (2^{n-1}+1)^{k} (2n1+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,n2)]k=(2n11)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 2n11

即: ( 2 n ) i + ( 2 n − 1 − 1 ) k − 1 − i (2^n)^i+(2^{n-1}-1)^{k-1-i} (2n)i+(2n11)k1i

#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;
		}
	}
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值