hdu 5139 Formula(离线处理)

来源:互联网 发布:技嘉主板网络唤醒设置 编辑:程序博客网 时间:2024/04/29 00:57

题目地址

题目大意:给出n(n<10000000),求f(n)=(i=1nini+1)%1000000007

解题思路:f(n) = 1^n+2^(n-1)+3^(n-2)+......+n^1,即求f(n) = n!*(n-1)!*......1,因为n比较大,对其进行离线处理,即统一输入,统一处理,最后统一输出,输入的时候用pair<int,int>类型的vector记录下记录下每次输入的n以及输入的次序,对pair进行sort排序,是根据first从小到大排序的,所以让first等于输入的n,对其排序,然后n从小到大根据公式线性的求值就可以了,注意输入的n可能有相同的。

#include <iostream>#include <cstdio>#include <cmath>#include <algorithm>#include <cstring>#include <vector>#include <queue>#include <string>#include <map>#include <set>#include <stack>using namespace std;const int mod = 1000000007;const int maxn = 10000000+100;int ans[maxn];int main(){    int n;    long long result,tmp;    int t,cnt;    vector<pair<int,int> > v;    cnt = 0;    while(scanf("%d",&n) != EOF)    {        v.push_back(make_pair(n,cnt++));    }    sort(v.begin(),v.end());    int maxx = v[cnt-1].first;    result = 1,tmp = 1,t = 0;    for(int i = 1; i <= maxx; i++)    {        tmp *= i;        if(tmp >= mod)            tmp %= mod;        result *= tmp;        if(result >= mod)            result %= mod;        while(t < cnt && v[t].first == i) //处理重复        {            ans[v[t].second] = result;            t++;        }    }    for(int i = 0; i < cnt; i++)            printf("%d\n",ans[i]);    return 0;}


0 0
原创粉丝点击