题目大意:
给你一个数
n
求
n
为
n
为
n
为
n
为
解题思路:
n的范围是
107
,
105
次询问,提前预处理肯定会MLE,直接暴力求会T。
由上式可以看出
f(i)=f(i−1)∗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 1000000007
struct 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;
}