CF1514B AND 0, Sum Big-不学数学,你怎么会有进步呢?qaq

Problem - 1514B - Codeforces

题意:给定n,k

元素为[0,2^k-1],(一共2^k个数),选n个数组成数列,使得

1:所有元素的&的和为0

2:所有元素的和尽量大

解:

假如n=2,k=2.可知元素只有2位

0:00

1:01

2:10

3:11

由条件1:数列的元素中,每一位至少有1个0

那么(0,2),(1,3)或(0,3),(1,2),都是可以的

但是有条件2的限制,那么只有(0,3),(1,2)是可以的

也就是说(0,3)比(0,2)更优

ans=2

注意到有k位,那么对于一个位,要选k次

又根据条件2,则每位选,有n个可能(只选n个数,可以保证)

由乘法原理:ans=n^k

假如k=3

0:000

1:001

2:010

3:011

4:100

5:101

6:110

7:111

n=1,只能选0

n=2,(0,7),(2,5),(4,3)(1,6)res=4*2=8=2^3

也就是说:对于每一位,n个元素,选1个元素此位为0,其余n-1个元素此位为1

对于每一位的每一个0,选择的可能为n个(只需要n个)

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const ll p=1e9+7;
ll qpow(ll a,ll x)
{
    ll y=1ll;
    while(x>0)
    {
        if(x&1)y=y*a%p;
        a=a*a%p;
        x>>=1;
    }
    return y;
}
int main()
{
    int t;cin>>t;
    while(t--)
    {
        ll n,k;cin>>n>>k;
        cout<<qpow(n,k)<<"\n";
    }
    return 0;
}

 

posted @ 2022-09-30 17:23  惣聪术  阅读(29)  评论(0)    收藏  举报