• 【bzoj3516】3516: 国王奇遇记加强版(递推)


    传送门

    题意:
    (displaystyle sum_{i=1}^n i^mm^i,nleq 10^9,mleq 1000)

    思路:
    (m)比较小,考虑从(m)入手进行递推:

    (f(j)=sum_{i=1}^ni^jm^i),则(mf(j)=sum_{i=1}^ni^jm^{i+1})

    接下来就是推式子时间:

    [egin{aligned} (1-m)f(j)=&sum_{i=1}^ni^jm^i-sum_{i=1}^ni^jm^{i+1}\ =&sum_{i=0}^{n-1}(i+1)^jm^{i+1}-sum_{i=0}^{n-1}i^jm^{i+1}-n^jm^{n+1}\ =&sum_{i=0}^{n-1}((i+1)^j-i^j)m^{i+1}-n^jm^{n+1}\ =&sum_{i=0}^{n-1}(sum_{k=0}^j{jchoose k}i^k-i^j)m^{i+1}-n^jm^{n+1}\ =&sum_{i=0}^{n-1}sum_{k=0}^{j-1}{jchoose k}i^km^{i+1}-n^jm^{n+1}\ =&sum_{k=0}^{j-1}{jchoose k}sum_{i=0}^{n-1}i^km^{i+1}-n^jm^{n+1}\ =&sum_{k=0}^{j-1}{jchoose k}msum_{i=0}^{n-1}i^km^{i}-n^jm^{n+1}\ =&sum_{k=0}^{j-1}{jchoose k}m(sum_{i=1}^ni^km^i+(k==0)-n^km^n)-n^jm^{n+1}\ =&sum_{k=0}^{j-1}{jchoose k}m(f(k)+(k==0)-n^km^n)-n^jm^{n+1}\ end{aligned} ]

    式子中需要注意的一点就是,当(k=i=0)时,有(0^0=1),这是定义,所以我们要特判一下然后加上一个(1)
    其它就没什么好说的了。感觉这种递推构造两个式子相减还是挺常见的。(就是想不到)
    代码如下:

    /*
     * Author:  heyuhhh
     * Created Time:  2020/4/17 19:45:42
     */
    #include <iostream>
    #include <algorithm>
    #include <cstring>
    #include <cstdio>
    #include <vector>
    #include <cmath>
    #include <set>
    #include <map>
    #include <queue>
    #include <iomanip>
    #include <assert.h>
    #define MP make_pair
    #define fi first
    #define se second
    #define pb push_back
    #define sz(x) (int)(x).size()
    #define all(x) (x).begin(), (x).end()
    #define INF 0x3f3f3f3f
    using namespace std;
    typedef long long ll;
    typedef pair<int, int> pii;
    //head
    const int N = 1000 + 5, MOD = 1e9 + 7;
    
    int qpow(ll a, ll b) {
        ll res = 1;
        while(b) {
            if(b & 1) res = res * a % MOD;
            a = a * a % MOD;
            b >>= 1;
        }   
        return res;
    }
    
    int n, m;
    int f[N], C[N][N];
    int pown[N];
    
    void run() {
        cin >> n >> m;
        if(m == 1) {
            cout << 1ll * n * (n + 1) / 2 % MOD << '
    ';
            return;
        }
        pown[0] = 1;
        for(int i = 1; i <= m; i++) pown[i] = 1ll * pown[i - 1] * n % MOD;
        int powm = qpow(m, n), powm1 = qpow(m, n + 1);
        int inv = qpow(1 - m + MOD, MOD - 2);
        f[0] = 1ll * m * (1 - powm + MOD) % MOD * inv % MOD;
        for(int i = 0; i < N; i++) {
            C[i][0] = 1;
            for(int j = 1; j <= i; j++) {
                C[i][j] = (C[i - 1][j - 1] + C[i - 1][j]) % MOD;   
            }
        }
        for(int i = 1; i <= m; i++) {
            f[i] = (MOD - 1ll * pown[i] * powm1 % MOD) % MOD;  
            for(int k = 0; k < i; k++) {
                int res = 1ll * C[i][k] * m % MOD * ((f[k] + (k == 0) - 1ll * powm * pown[k] % MOD + MOD) % MOD) % MOD;
                f[i] = (f[i] + res) % MOD;
            }
            f[i] = 1ll * f[i] * inv % MOD;
        }
        cout << f[m] << '
    ';
    }
    
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(0); cout.tie(0);
        cout << fixed << setprecision(20);
        run();
        return 0;
    }
    
  • 相关阅读:
    Spring MVC实现QQ第三方登录 博客分类: spring
    Ajax Post提交事例及SpringMVC注解@RequestMapping取不到参数值解决办法
    js注册检测 用户名、密码、手机号、邮箱
    SpringMVC介绍之Validation
    菜鸟级springmvc+spring+mybatis整合开发用户登录功能(上)
    通过Ajax post Json类型的数据到Controller
    基于SpringMVC与jquery的ajax提交表单的若干情况详解
    jquery ajax提交表单数据的两种方式
    SpringMVC 返回字符串
    后台数据库优化——板机
  • 原文地址:https://www.cnblogs.com/heyuhhh/p/12742263.html
Copyright © 2020-2023  润新知