题解:P10404 「XSOI-R1」原神数
前置知识:Miller_Rabin 算法。
显然我们需要判断一个数是不是质数。
令判断的数为
然后判断
虽然但是,如果是,
否则,考虑二次探测定理。
显然
证明挺简单,这里懒得证。
先用
然后先将
如果
若
否则一直除,直至
很显然这个东西有可能是错的,于是考虑多测几个
复杂度
经过检验,选
目前没用任何能够低于
感觉错误概率很可以忽略了,至少对付本题取
然后这个题虽然
然后对于十位数,如果没有重复数字,则必然
然后我们考虑直接爆搜所有符合条件二的数字,然后把质数存起来,也就二十多万个,排序完之后二分即可。
注意的是有点卡常,千万别 dill,然后加一点正常的卡常技巧就能 A 了。
感觉挺简单,但是我不会 T1 却秒了 T4,有点小丑。
放一个我也不知道对不对的 MR:
vector<int> P = {3, 7, 61};
I int Pow(int a, int b, int p) {
int ans = 1;
while(b) {
if(b & 1) ans = 1ll * ans * a % p;
a = 1ll * a * a % p; b >>= 1;
}
return ans;
}
I bool check(int x, int p) {
int T = ctz(x - 1);
int now = Pow(p, x - 1 >> T, x), pre;
if(now == 1) return 1;
while(T--) {
pre = now;
now = 1ll * now * now % x;
if(now == 1) return pre == x - 1;
}
return 0;
}
I bool isprime(int x) {
if(x == 0 || x == 1) return 0;
for(int i = 0; i < P.size(); i++) {
if(x == P[i]) return 1;
if(x % P[i] == 0) return 0;
if(!check(x, P[i])) return 0;
}
return 1;
}