别看这道题,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;
}
}



京公网安备 11010502036488号