传送门
Solution
\(1\_998244353\):求\(19\)的幂,因为次数可能很大,所以直接对\(P\)的欧拉函数取模
\(1?\)/\(1?+\):要猜模数,分别是\(1145141\),\(5211600617818708273\)
\(1wa\_998244353\):不能快速幂了,需要直接乘。。。发现循环节很短,考虑直接求出来
\(2p\):区间求质数, \(Miller\_ Rabbin\)即可
\(2u\):区间求莫比乌斯函数,先把\(10^6\)内的质数筛出来处理区间的数,大于\(10^6\)的质因子最多两个,先判断剩下的积是不是完全平方数,再用\(MR\)判断是不是质数
\(2g\):区间求原根,设\(P\)的质因子有\(n\)种
- 对于区间长但原根小的,用\(O(Pk)\)的方法,先找到一个原根\(g\)(观察数据即可),然后把形如\(g^i,i|P-1\),的筛掉,枚举\(P-1\)的每个质因子分别筛
- 对于区间短但是原根大的,用\(O(len \cdot n\log P)\),枚举\(x^{\frac{(P-1)}{p_i}}\),判断是否模\(P\)余\(1\)
Code
#include
#define ll long long
#define dbg1(x) cerr<<#x<<"="<<(x)<<" "
#define dbg2(x) cerr<<#x<<"="<<(x)<<"\n"
#define dbg3(x) cerr<<#x<<"\n"
using namespace std;
#define reg register
inline ll read()
{
ll x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x*f;
}
char ch[100];
ll Mul(ll x,ll y,const ll M){return (x*y-(ll)((long double)x/M*y+.5)*M+M)%M;}
ll Add(ll a,ll b,const ll M){return (a+b)%M;}
ll fp(ll x,ll y,const ll M)
{
ll r=1;for(;y;y>>=1,x=Mul(x,x,M))if(y&1)r=Mul(r,x,M);
return r;
}
const ll a[]={2,3};
bool pd(ll x,int y=2)//Miller_Rabin
{
for(int i=0;i>=1;k=fp(a[i],j,x);
if(Mul(k,k,x)==1&&k!=1&&k!=x-1) return false;
}
}
return true;
}
namespace pow19
{
ll Read(ll M)
{
static char s[100];
scanf("%s",s);ll r=0;int len=strlen(s);
for(int i=0;i
Blog来自PaperCloud,未经允许,请勿转载,TKS!