题目描述
lglg最近爱上了炒股,他想在股票市场内买一些股票。
现在有编号为1,2,3,…,100000000的100000000支股票,每个股票的价值等于其编号的阶乘(例如编号为5的股票的价值就是120)。
lglg是一个很挑剔的人,他只喜欢编号为质数的股票,但他很有钱,因此他希望买下所有编号小于等于N(1<=N<=1e8)并且编号为质数的股票,请你帮他算一算这些股票的价值之和。
由于价值和很大,他希望你能告诉他价值之和对P(1e3<=P<=1e5)取模后的值。
输入描述:
输入包含多组数据 第一行是一个正整数 T(1<=T<=1000),代表数据的组数。
每组数据只有一行,包含两个正整数 N 和 P 数字之间用空格隔开,其代表的含义及范围已在题面中给出。
输出描述:
每组数据输出一行,表示lglg希望买下的所有股票的价值之和对P取模后的值
示例1
输入
2
5 1001
20 1001
输出
128
86
思路:
题意结合
#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstdlib>
#include<stack>
#include<queue>
#include<functional>
#include<stdio.h>
#include <queue>
#include<string.h>
#define PI 3.1415926535
#define MAX 10005
#define INF 0x3f3f3f3f
#define lowbit(x) (x&(-x))
#define fori(a,b) for(int i=a;i<=b;i++)
#define mem(a,b) memset(a,b,sizeof(a))
#define BASE 10000
#define BASE 10000
//#define ll long long
using namespace std;
typedef long long ll;
const int maxn=1e5+5;
using namespace std;
typedef struct fract fract;
bool ola[maxn];
int main()
{
ll q;
cin>>q;
ola[1]=1;
for(int i=2; i<=1000; i++)
{
for(int j=2; j<=100000/i; j++)
{
ola[i*j]=1;
}
}
while(q--)
{
ll n,p,s=0;
cin>>n>>p;
ll k=1;
for(ll i=2; i<=n&&k%p!=0&&i<=p; i++)
{
k=(k*i)%p;
if(ola[i]==0)
s=(s+k)%p;
}
cout<<s%p<<endl;
}
return 0;
}