这题是我之前做过的一道思维题和欧拉筛的组合版本真的很强
有一个点就是题目拿很大的数来吓唬你
1e9有必要???
当取模的数大于p时结果就是0,所以p后面的数完全不用考虑!!
我一开始还用同余定理用字符数组你敢相信?后来想想题目不可能这样搞
欧拉筛板子
特强
中间还用到了同余定理的知识
避免溢出
上代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 100000;
bool check[maxn + 10];
int phi[maxn + 10];
int prime[maxn + 10];
int tot;
void f3()
{
memset(check, false, sizeof(check));
check[1]=true;
phi[1] = 1;
tot = 0;
for (int i = 2; i <= maxn; i++)
{
if (!check[i])
{
prime[tot++] = i;
phi[i] = i - 1;
}
for (int j = 0; j < tot; j++)
{
if (i * prime[j] > maxn)
{
break;
}
check[i * prime[j]] = true;
if (i % prime[j] == 0)
{
phi[i * prime[j]] = phi[i] * prime[j];
break;
}
else
{
phi[i * prime[j]] = phi[i] * (prime[j] - 1);
}
}
}
return ;
}
int main()
{
f3();
int t,n,p;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&p);
int flag=min(n,p);
long long ans=0,temp=1;
for(int i=2;i<=flag;i++)
{
temp*=i;
temp%=p;
if(!check[i])
ans=(ans+temp)%p;
}
printf("%d\n",ans);
}
return 0;
}
这个板子是我拿一个很优秀的博主那借来的每次多打几遍渐渐也就熟了虽然我不会证
哇呜呜我太菜了
加油