别看这道题,N的范围是1e8,最后是要对P取余的,因为是阶乘的缘故,所以自P往后股票的价值都可以%P=0,所以这道题N的范围就缩小到P的范围(1e5),这样直接套用埃式筛或者欧拉筛模版就可以了,两种筛法的模版在我的博客里都有,如果有需要的,可以借鉴。

#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <vector>
#include <stack>
#include <sstream>
#include <map>
#include <set>
#include <queue>
#include <stdlib.h>
typedef long long ll;

using namespace std;

const int maxn=1e6+7;//总的范围规定在这里

int a[1000007]; //1e6的大小,可是N到了1e8 ,=1代表不是素数,0代表是素数

void isN() //埃式筛
{
    for(int i=2;i<1000007;i++)
    {
        if(a[i]==0)
        {
            for(int j=i*2;j<1000007;j+=i)
            {
                a[j]=1;
            }
        }
    }
}

int main()
{
    int t;
    cin >> t; //样例个数
    isN();
    while(t--)
    {
        long long h,m,s=1,sum=0; //h是股票到多少号, m是mod,
        cin >> h >> m;

        for(int i=2;i<=min(h,m);i++)
        {
            s=(s*i)%m;
            if(a[i]==0) //如果是素数
            {
                sum+=s; //sum加上s之后对m取模
                sum%=m;
            }
        }
        cout << sum << endl;
    }

}