HDU 5139 Formula(数据离线处理)

来源:互联网 发布:stc单片机iap选型 编辑:程序博客网 时间:2024/04/29 01:32

题目大意:
满足这个公式
给你一个数nf(n)的值,
n1时:1
n2时:122
n3时:13223
n4时:1423324
n5时:152433425

解题思路:
n的范围是107,105 次询问,提前预处理肯定会MLE,直接暴力求会T。
由上式可以看出f(i)=f(i1)n!i的值所以将上式的值储存,一个105 的for循环就可以搞定
题目链接:HDU 5139

AC代码:

#include <iostream>#include <stdio.h>#include <cmath>#include <algorithm>#include <cstring>using namespace std;#define ll long long#define mod 1000000007struct test{    ll val;///存储输入的值    ll id;///输入的顺序    ll ans;///结果}a[100010];bool cmp1(test x,test y){    return x.val<y.val;}bool cmp2(test x,test y){    return x.id<y.id;}int main(){    int n;    ll cnt=0;    while(~scanf("%d",&n))    {        a[cnt].val=n;        a[cnt++].id=cnt;    }    ll tmp=1;    sort(a,a+cnt,cmp1);///按照存入的值进行排序    ll num=0;    ll ans=1;    for(int i=1;num<cnt;i++)    ///从1开始跑数据,知道跑到存入数据的最大值结束    {        while(i<=a[num].val)        ///当跑到要处理的结果时跳出循环,记录结果        {            ans=((ans*tmp)%mod*i)%mod;            tmp=(tmp*i)%mod;            i++;        }        i--;        a[num++].ans=ans;    }    sort(a,a+cnt,cmp2);    ///按照输入的顺序进行排序,输出结果    for(int i=0;i<cnt;i++)        printf("%I64d\n",a[i].ans);    return 0;}
0 0