「十二省联考 2019」骗分过样例

传送门

Solution 

\(1\_998244353\):求\(19\)的幂,因为次数可能很大,所以直接对\(P\)的欧拉函数取模

\(1?\)/\(1?+\):要猜模数,分别是\(1145141\)\(5211600617818708273\)

\(1wa\_998244353\):不能快速幂了,需要直接乘。。。发现循环节很短,考虑直接求出来

\(2p\):区间求质数, \(Miller\_ Rabbin\)即可

\(2u\):区间求莫比乌斯函数,先把\(10^6\)内的质数筛出来处理区间的数,大于\(10^6\)的质因子最多两个,先判断剩下的积是不是完全平方数,再用\(MR\)判断是不是质数

\(2g\):区间求原根,设\(P\)的质因子有\(n\)

  1. 对于区间长但原根小的,用\(O(Pk)\)的方法,先找到一个原根\(g\)(观察数据即可),然后把形如\(g^i,i|P-1\),的筛掉,枚举\(P-1\)的每个质因子分别筛
  2. 对于区间短但是原根大的,用\(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!

转载于:https://www.cnblogs.com/PaperCloud/p/11306120.html

你可能感兴趣的:(「十二省联考 2019」骗分过样例)