• 腾讯消消乐


    腾讯推出了一款益智类游戏——消消乐。游戏一开始,给定一个长度为 nn 的序列,其中第 ii个数为 A_iAi

    游戏的目标是把这些数全都删去,每次删除的操作为:选取一段连续的区间,不妨记为 [L,R][L,R],如果这一段区间内所有数的最大公约数 geq kk(kk 值在游戏的一开始会给定),那么这一段区间就能被直接删去。

    注意:一次删除以后,剩下的数会合并成为一个连续区间。

    定义 f(i)f(i) 为进行 ii 次操作将整个序列删完的方案数。

    你需要实现一个程序,计算 sum_{i=1}^{n}{(f(i) ast i)} ext{ mod } 1000000007i=1n(f(i)i) mod 1000000007。

    输入格式

    第一行输入两个整数 n,k(1le n le 18)n,k(1n18)。

    第二行输入 nn 个正整数 a_i(1 le a_i le 10^5)ai(1ai105),表示初始序列中的每个数。

    输入数据保证 1 le k le min(a_1,a_2,ldots a_n)1kmin(a1,a2,an)。

    输出格式

    输出一个整数,表示算出的答案。

    样例说明

    对于样例 1 而言,f(1)=1f(1)=1,f(2)=9f(2)=9,f(3)=26f(3)=26,f(4)=24f(4)=24。

    对于样例 2,f(1)=0f(1)=0,f(2)=2f(2)=2。

    样例输入1

    4 1
    1 1 1 1

    样例输出1

    193

    样例输入2

    2 2
    2 3

    样例输出2

    4

    样例输入3

    1 233
    233

    样例输出3

    1
    #include <bits/stdc++.h>
    
    using namespace std;
    typedef long long ll;
    const int maxn = (1<<18)+108;
    const ll mod = 1e9 + 7;
    
    int n, k;
    ll val[maxn];
    ll dp[2][maxn];
    vector<ll> e;
    
    inline void debug() {
        printf("debug
    ");
        for (register int i = 0; i < e.size(); ++i) {
            printf("e[%d] = %d
    ", i, e[i]);
        }
    }
    
    inline ll gcd(ll a, ll b) {
        return b == 0 ? a : gcd(b, a % b);
    }
    
    int main() {
    #ifndef ONLINE_JUDGE
        freopen("1.txt", "r", stdin);
    #endif
        scanf("%d%d", &n, &k);
        for (register int i = 1; i <= n; ++i) {
            scanf("%lld", &val[i]);
        }
        int pos = 0;
        for (register int i = 1; i <= n; ++i) {
            ll cur = val[i];
            ll id = 0;
            for (register int j = i; j <= n; ++j) {
                if ((cur = (gcd(cur, val[j]))) >= k) {
                    id ^= (1 << (n - j));
                    dp[pos][id] = 1;
                } else {
                    break;
                }
            }
        }
        pos ^= 1;
        ll res = 0;
        for (register int i = 2; i <= n; pos ^= 1, ++i) {
            memset(dp[pos], 0, sizeof(dp[pos]));
            res += (i - 1) * dp[pos ^ 1][(1 << n) - 1];
            res %= mod;
            for (register int j = 0; j < (1 << n); ++j) {
                if (!dp[pos ^ 1][j])continue;
                e.clear();
                ll tot = n, o = j;
                while (tot) {
                    if (!(o & 1))e.emplace_back(tot);
                    o >>= 1;
                    --tot;
                }
                //debug();
                for (register int h = 0; h < e.size(); ++h) {
                    ll cur = val[e[h]], id = 0;
                    for (register int q = h; q < e.size(); ++q) {
                        if ((cur = gcd(cur, val[e[q]])) >= k) {
                            id ^= (1 << (n - e[q]));
                            dp[pos][j ^ id] += dp[pos ^ 1][j];
                            dp[pos][j ^ id] %= mod;
                        } else {
                            break;
                        }
                    }
                }
            }
        }
        res += n * dp[pos ^ 1][(1 << n) - 1];
        res %= mod;
        printf("%lld
    ", res);
        return 0;
    }
  • 相关阅读:
    教你如何去除电脑QQ聊天窗口上的广告?
    Web 通信技术 ——跨文档信息传输(JavaScript)
    JavaScript中如何给按钮设置隐藏与显示属性
    JavaScript中的innerHTML属性的使用
    JavaScript中点击按钮弹出新的浏览器窗口
    JavaScript中prompt的使用
    考试报名管理系统
    Python——用turtle模块画海龟的第一步
    Cardinality Estimation算法学习(二)(Linear Counting算法、最大似然估计(MLE))
    用KMP算法与Trie字典树实现屏蔽敏感词(UTF-8编码)
  • 原文地址:https://www.cnblogs.com/czy-power/p/11463239.html
Copyright © 2020-2023  润新知