首页 > 其他分享 >P3773 [CTSC2017]吉夫特

P3773 [CTSC2017]吉夫特

时间:2022-11-27 10:12:15浏览次数:51  
标签:const Lucas int text 定理 P3773 夫特 include CTSC2017

发现只要式子中有一个数为奇数,整个式子就为 \(0\)。

把膜数代到每一乘积项中,容易发现这个东西就是一个 \(\text{Lucas}\) 定理。

卢卡斯定理有一个性质,那就是如果膜数是 \(p\),那么使用 \(\text{Lucas}\) 定理就和 \(p\) 进制数类似。

递归展开 \(\text{Lucas}\) 就容易发现对于 \({n \choose m}\),如果出现 \(n = 0,m = 1\) 即 \({ 0 \choose 1 }\) 的情况,那么这个式子就是 \(0\) 了。

根据 \(\text{Lucas}\) 定理 \(p\) 进制数的性质,直接位运算 \(n | m\) 即可判断一个组合数是否为奇数。

然后仿照最长上升子序列这样的问题写个 \(dp\) 转移就行了,转移就是枚举子集,因为转移条件是或运算,复杂度是 \(O(3^n)\) 证明大概就是二项式定理整整就出来了。

代码放一下,免得以后忘了枚举子集怎么写。

#include <cstdio>
#include <algorithm>
#include <cstring>

using std::max;

typedef long long ll;

const int MAXN = 211985 + 5;
const int MAXA = 233333 + 5;
const int MOD = 1e9 + 7;

int n, a[MAXN << 1];
int id[MAXA << 1];
ll f[MAXA << 1];

int main() {

    scanf("%d", &n);
    for (int i = 1; i <= n; ++i) {
        scanf("%d", &a[i]);
        id[ a[i] ] = i;
    }
    ll ans = 0;
    for (int i = 1; i <= n; ++i) {
        for (int s = (a[i] - 1) & a[i]; s; s = (s - 1) & a[i]) {
            if (id[s] > i) {
                f[s] = (f[s] + f[ a[i] ] + 1) % MOD;
            }
        }
        ans = (ans + f[ a[i] ]) % MOD;
    }
    printf("%lld\n", ans);

    return 0;
}

标签:const,Lucas,int,text,定理,P3773,夫特,include,CTSC2017
From: https://www.cnblogs.com/louis660/p/16929054.html

相关文章

  • 「CTSC2017」游戏
    题目点这里看题目。按照如下方式生成一个长度为\(n\)的\(01\)串\(s\):\(s_1\)由一个参数\(p_1\)决定,表示\(s_1\)有\(p_1\)的概率为\(\texttt1\),有\(1-......
  • [CTSC2017]游戏
    linkSolution其实问题在于当你确定了后面的一个数之后因为不独立,所以会影响前面的概率,所以这时候我们就需要贝叶斯公式去计算了。因为我们最后需要算的是期望赢的次数,所......