链接:
https://www.nowcoder.com/acm/contest/115/H
来源:牛客网
来源:牛客网
题目描述
晚上,小P喜欢在寝室里一个个静静的学习或者思考,享受自由自在的单身生活。
他总是能从所学的知识散发出奇妙的思维。
今天他想到了一个简单的阶乘问题,
0!= 1
1!= 1
2!= 1 * 2 = 2
3!= 1 * 2 * 3 = 6
4!= 1 * 2 * 3 *4 = 24
5!= 1 * 2 * 3 *4 * 5 = 120
。
。
如果 n=1000000000,那么n的阶乘会是多少呢,小P当然知道啦,那么你知道吗?
输入描述:
第一行输入一个整数T(表示样例个数) 接下来T组样例 每组样例一行,输入一个整数N(0<=N<=1000000000)
输出描述:
输出T行
每一行输出N的阶乘 N!(由于这个数比较大,所以只要输出其对1000000007取膜的结果即可)
题解:
分段打表,每长度为一千万的区间打一个表,就可以在一千万的复杂度内求解。
代码:
#include<cstdio>
using namespace std;
#define ll long long
const ll mod=1e9+7;
ll a[202];
int main()
{
a[0]=1;
a[1]=682498929,
a[2]=491101308,
a[3]=76479948,
a[4]=723816384,
a[5]=67347853,
a[6]=27368307,
a[7]=625544428,
a[8]=199888908,
a[9]=888050723,
a[10]=927880474,
a[11]=281863274,
a[12]=661224977,
a[13]=623534362,
a[14]=970055531,
a[15]=261384175,
a[16]=195888993,
a[17]=66404266,
a[18]=547665832,
a[19]=109838563,
a[20]=933245637,
a[21]=724691727,
a[22]=368925948,
a[23]=268838846,
a[24]=136026497,
a[25]=112390913,
a[26]=135498044,
a[27]=217544623,
a[28]=419363534,
a[29]=500780548,
a[30]=668123525,
a[31]=128487469,
a[32]=30977140,
a[33]=522049725,
a[34]=309058615,
a[35]=386027524,
a[36]=189239124,
a[37]=148528617,
a[38]=940567523,
a[39]=917084264,
a[40]=429277690,
a[41]=996164327,
a[42]=358655417,
a[43]=568392357,
a[44]=780072518,
a[45]=462639908,
a[46]=275105629,
a[47]=909210595,
a[48]=99199382,
a[49]=703397904,
a[50]=733333339,
a[51]=97830135,
a[52]=608823837,
a[53]=256141983,
a[54]=141827977,
a[55]=696628828,
a[56]=637939935,
a[57]=811575797,
a[58]=848924691,
a[59]=131772368,
a[60]=724464507,
a[61]=272814771,
a[62]=326159309,
a[63]=456152084,
a[64]=903466878,
a[65]=92255682,
a[66]=769795511,
a[67]=373745190,
a[68]=606241871,
a[69]=825871994,
a[70]=957939114,
a[71]=435887178,
a[72]=852304035,
a[73]=663307737,
a[74]=375297772,
a[75]=217598709,
a[76]=624148346,
a[77]=671734977,
a[78]=624500515,
a[79]=748510389,
a[80]=203191898,
a[81]=423951674,
a[82]=629786193,
a[83]=672850561,
a[84]=814362881,
a[85]=823845496,
a[86]=116667533,
a[87]=256473217,
a[88]=627655552,
a[89]=245795606,
a[90]=586445753,
a[91]=172114298,
a[92]=193781724,
a[93]=778983779,
a[94]=83868974,
a[95]=315103615,
a[96]=965785236,
a[97]=492741665,
a[98]=377329025,
a[99]=847549272,
a[100]=698611116;
int T;scanf("%d",&T);
while(T--)
{
ll n;scanf("%lld",&n);
ll t=a[n/10000000];
for(ll i=(n/10000000)*10000000+1;i<=n;i++)
t=t*i%mod;
printf("%lld\n",t);
}
return 0;
}