QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#590051 | #249. Miller Rabin 算法 | lanhuo | WA | 21ms | 3752kb | C++17 | 1.5kb | 2024-09-25 21:15:17 | 2024-09-25 21:15:17 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll prime[10] = {2,3,5,7,11,13,17,19,23,29};
ll Quick_Multiply(ll a, ll b, ll c)
{
ll ans = 0, res = a;
while(b)
{
if(b & 1)
ans = (ans + res) % c;
res = (res + res) % c;
b >>= 1;
}
return ans;
}
ll Quick_Power(ll a, ll b, ll m)
{
ll ans = 1;
while(b)
{
if(b & 1)
{
ans = ans * a % m;
}
a = a * a % m;
b >>= 1;
}
return ans;
}
bool Miller_Rabin(ll x) //判断素数
{
ll i, j, k;
ll s = 0, t = x-1;
if(x == 2) return true; //2是素数
if(x < 2 || !(x & 1)) return false; //如果x是偶数或者是0,1,那它不是素数
while(!(t & 1)) //将x-1分解成(2^s)*t的样子
{
s++;
t >>= 1;
}
for(i = 0; i < 10 && prime[i] < x; i++) //随便选一个素数进行测试
{
ll a = prime[i];
ll b = Quick_Power(a, t, x); //先算出a^t
for(j = 1; j <= s; j++) //然后进行s次平方
{
k = Quick_Multiply(b,b,x); //求b的平方
if(k == 1 && b != 1 && b != x-1)
return false;
b = k;
}
if(b != 1) return false; //用费马小定理判断
}
return true; //如果进行多次测试都是对的,那么x就很有可能是素数
}
int main()
{
ll x;
while(cin>>x){
if(Miller_Rabin(x)) printf("Y");
else printf("N");
}
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 0
Wrong Answer
time: 21ms
memory: 3752kb
input:
996581938833575363 971646509461160317 773155992127361153 161603952726515268 540879144500456953 476831214764178553 784255927154201144 671096087619405061 805545190025269709 339546334309245137 337726347922962343 222956293307015293 809183111090275843 799050063298926344 691718101820598109 646220213113313...
output:
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN...
result:
wrong answer 1st lines differ - expected: 'N', found: 'NNNNNNNNNNNNNNNNNNNNNNNNNNNNNN...NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN'