• 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;
    }
  • 相关阅读:
    兑奖
    杨辉三角
    偶数求和
    进制转化
    填词
    等值数目
    Spring框架的七个模块
    数据库中的第1、2、3范式 (昨天没睡好,因为那个蚊子~~)
    关于eclipse 不编译或者找不到*.class的问题
    servlet生命周期的理解
  • 原文地址:https://www.cnblogs.com/qscqesze/p/5375742.html
Copyright © 2020-2023  润新知