zoukankan      html  css  js  c++  java
  • Educational Codeforces Round 11 E. Different Subsets For All Tuples 动态规划

    E. Different Subsets For All Tuples

    题目连接:

    http://www.codeforces.com/contest/660/problem/E

    Description

    For a sequence a of n integers between 1 and m, inclusive, denote f(a) as the number of distinct subsequences of a (including the empty subsequence).

    You are given two positive integers n and m. Let S be the set of all sequences of length n consisting of numbers from 1 to m. Compute the sum f(a) over all a in S modulo 109 + 7.

    Input

    The only line contains two integers n and m (1 ≤ n, m ≤ 106) — the number of elements in arrays and the upper bound for elements.
      

    Output

    Print the only integer c — the desired sum modulo 109 + 7.

    Sample Input

    1 3

    Sample Output

    6

    Hint

    题意

    现在定义f(a)表示这个a串里面所有不相同的子序列的个数

    现在给你n,m,让你用字符集为m,去构造出长度为n的串

    然后让你算出所有f(a)的累加

    题解:

    考虑dp

    dp[i][j]表示长度为i,以字符j结尾的答案是多少

    dp[i][j]=sigma(dp[i-1][k]*2-dp[pre[j]-1][k])

    然后这个玩意儿显然对于任意的j的都是一样的,而且pre[j]前面的每个位置都是可能的,这里的dp是个前缀和,所以直接扣除就可以了

    那么直接化简为:dp[i]=dp[i-1]*(2m-1)

    但是这个dp是没有考虑空串的

    那么在加上空串就好了,所以答案就是

    dp[i] = dp[i-1]*(2m-1)+m^(i-1)

    代码

    #include<bits/stdc++.h>
    using namespace std;
    const int mod = 1e9+7;
    
    int main()
    {
        int n,m;
        scanf("%d%d",&n,&m);
        long long ans = 2*m;
        long long tmp = 1;
        for(int i=2;i<=n;i++)
        {
            tmp = tmp * m % mod;
            ans = (ans * (2 * m - 1) % mod + tmp + mod) % mod;
        }
        cout<<ans<<endl;
    }
  • 相关阅读:
    496. 下一个更大元素 I
    240. 搜索二维矩阵 II
    java反射之ObjectAnalyzer
    PHP导出excel文件的多种方式
    git获取公钥和私钥以及常用的命令
    PHP PSR-2 代码风格规范
    phpStrom安装PHP_CodeSniffer检查代码规范
    常见PHP安全网站漏洞及防范措施
    Oracle中创建主键并在Spring data JPA中使用
    JPA自定义查询中报错:缺失右括号
  • 原文地址:https://www.cnblogs.com/qscqesze/p/5375742.html
Copyright © 2011-2022 走看看