Topic link: Little P's math problems
meaning of the title
At night, Little P likes to study or think quietly in the dormitory one by one, enjoying a free single life.
He has always been able to radiate wonderful thinking from what he has learned.
Today he thought of a simple factorial problem,
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
。
。
If n=1000000000, what will the factorial of n be? Of course little P knows, so do you know?
Enter description:
第一行输入一个整数T(表示样例个数)
接下来T组样例
每组样例一行,输入一个整数N(0<=N<=1000000000)
Output description:
输出T行
每一行输出N的阶乘 N!(由于这个数比较大,所以只要输出其对1000000007取膜的结果即可)
ideas
Very violent, very violent, very violent!
If the size of N is in 0<=N<=1000000000, the violent cycle will definitely explode, then some simple optimizations are performed, such as dividing the maximum range of N 1e9 into 100 parts, and first put the value on each node. save. Then, when reading the value, determine which interval the segment is in. At this time, the loop is at most 1e7 times, and this is a simple loop, and the time spent must be very small.
code
#include<iostream>
#include<cstdio>
#define lon long long
using namespace std;
lon n,p = 1000000007;
lon a[110]={1,682498929,491101308,76479948,723816384,67347853,27368307,
625544428,199888908,888050723,927880474,281863274,661224977,623534362,
970055531,261384175,195888993,66404266,547665832,109838563,933245637,
724691727,368925948,268838846,136026497,112390913,135498044,217544623,
419363534,500780548,668123525,128487469,30977140,522049725,309058615,
386027524,189239124,148528617,940567523,917084264,429277690,996164327,
358655417,568392357,780072518,462639908,275105629,909210595,99199382,
703397904,733333339,97830135,608823837,256141983,141827977,696628828,
637939935,811575797,848924691,131772368,724464507,272814771,326159309,
456152084,903466878,92255682,769795511,373745190,606241871,825871994,
957939114,435887178,852304035,663307737,375297772,217598709,624148346,
671734977,624500515,748510389,203191898,423951674,629786193,672850561,
814362881,823845496,116667533,256473217,627655552,245795606,586445753,
172114298,193781724,778983779,83868974,315103615,965785236,492741665,
377329025,847549272,698611116};
int main()
{
int t;
cin>>t;
while(t--){
cin>>n;
if(n>=p){
cout<<0<<endl;
continue;
}
if(p==1000000007){
lon now=n/10000000;
lon ans=a[now];
for(lon i=now*10000000+1;i<=n;i++)
ans=ans*i%p;
cout<<ans%p<<endl;
continue;
}
lon ans=1;
for(int i=1;i<=n;i++)
ans=ans*i%p;
cout<<ans%p<<endl;
}
return 0;
}