牛客:牛牛的算术(线性递推)

题意:

链接:https://ac.nowcoder.com/acm/contest/7079/B来源:牛客网

牛牛最近学习了取模是什么 于是他看到了下面这一道题:

多次询问:每次询问包含一个正整数 nnn 要求你输出下列结果
∏i=1n∑j=1i∑k=1ji×j×k\prod_{i=1}^n \sum_{j=1}^i \sum_{k=1}^j i\times j\times ki=1nj=1ik=1ji×j×k
为了避免结果过大 只需要输出这个式子对 199999199999199999(=2×32×41×271+1=2\times 3^2 \times 41 \times 271+1=2×32×41×271+1,一个质数) 取模的结果。

题解:

线性递推一下,答案从n-1到n之间的转移应该是比较显然的。

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+100;
const int mod=199999;
typedef long long ll;
int t;
int n;
ll ans[maxn];
ll f[maxn];
ll tt[maxn];

int main () {
    ans[0]=1;
    for (int i=1;i<maxn;i++) {
        f[i]=f[i-1]+i;
        f[i]%=mod;
        tt[i]=tt[i-1]+i*f[i]%mod;
        tt[i]%=mod;
        ans[i]=ans[i-1]*tt[i]%mod*i;
        ans[i]%=mod;
    }
    int t;
    scanf("%d",&t);
    while (t--) {
        string s;
        cin>>s;
        if (s.size()>6) {
            printf("0\n");
            continue;
        }
        n=0;
        for (int i=0;i<s.size();i++) n=n*10+s[i]-'0';
        if (n>=199999) {
            printf("0\n");
            continue;
        }
        printf("%lld\n",ans[n]);
        //for (int i=1;i<=n;i++) printf("%d\n",cnt[i]);
    }
}

 

posted @ 2020-08-28 22:47  zlc0405  阅读(155)  评论(0编辑  收藏  举报