The first programming competition of Jiangxi University of Finance and Economics - Mathematical problems of small P (violent MAX optimization skills)

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组样例
每组样例一行,输入一个整数N0<=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;
}

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=324700232&siteId=291194637