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