江西财经大学第一届程序设计竞赛 H-小P的数学问题

链接: 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值