• Moamen and XOR和Ezzat and Grid的题解[Codeforces Round #737 (Div. 2)]


    C:

    题目传送门

    题意:

    求n个小于2^k的数

    a1&a2&a3&…&an≥a1⊕a2⊕a3⊕…⊕an

    的数量

    分析:

    首先玩一下小样例,考虑第i位

    如果有奇数个a,那么如果第i位1的个数是奇数且至少有一个0,会让结果小于,否则一定等于。那第i位就有 (2^n- (2^n-1) ) 种可能取的情况。

    如果有偶数个a,那么只有第i位全为1才会使结果大于,只有有偶数个1偶数个0才会使结果等于。那么大于的话,直接加上后面乱组的情况,等于的话,去递归下一位。

    code:

    #include<bits/stdc++.h>
    using namespace std;
    
    long long pw[200001]={1},n,k,P=1000000007;
    
    int qpow(int x, int y){
        long long re=1;
        while(y) {
            if(y&1) re=1LL*re*x%P;
            x=1LL*x*x%P, y>>=1;
        }
        return re;
    }
     
    int solve(int x){
        if(!x) return 1;
        if(n&1) return 1LL*(pw[n-1]+1)*solve(x-1)%P;
        return (qpow(pw[n], x-1)+1LL*(pw[n-1]-1)*solve(x-1))%P;
    }
     
    int main(){
        int T; cin>>T;
        for(int i=1; i<=200000; ++i)
            pw[i]=1LL*pw[i-1]*2%P;  
        while(T--) {
            cin>>n>>k;
            printf("%d
    ", solve(k));
        }
        return 0;
    }
    
    

    D:

    不用dp

    直接线段树动态开点做

    按照最长上升子序列的做法

    比如 第一行的 L - R 记录一个pair<1,1>

    第二行找到最大的哪个pair区间,然后把pre[2]赋值为这个最大pair区间的i值,然后把自己的pair更新成pair<2,2>第一个2是长度,第二个2是自己的行数

    code:

    我等下再贴

  • 相关阅读:
    openGL线s的绘制
    openGL绘制正方形
    openGL的使用步骤
    [归并排序][逆序数]Brainman
    [动态规划]Tak and Cards
    [STL][stack]简单计算器
    [题解]2018湘潭邀请赛
    [数论][组合数学]Iroha and a Grid
    [STL][stack]括号配对问题
    [简单思维题]Sequence(山东省第九届ACM大学生程序设计竞赛E题)
  • 原文地址:https://www.cnblogs.com/GUOGaby/p/15123451.html
Copyright © 2020-2023  润新知