2018宁夏邀请赛 - Goldbach(米勒罗宾素数测试)
生活随笔
收集整理的這篇文章主要介紹了
2018宁夏邀请赛 - Goldbach(米勒罗宾素数测试)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題目鏈接:點(diǎn)擊查看
題目大意:給出一個(gè)偶數(shù),將其拆為兩個(gè)素?cái)?shù)之和
題目分析:因?yàn)閷⒁粋€(gè)偶數(shù)拆為兩個(gè)素?cái)?shù)和時(shí),答案會(huì)有多種情況,挑較小的素?cái)?shù)最小時(shí),一般此素?cái)?shù)會(huì)非常小,最大也超不過(guò)一萬(wàn),所以我們需要解決如何快速判斷一個(gè)數(shù)是否為素?cái)?shù),如果用素?cái)?shù)的定義來(lái)判斷,那么根號(hào)n的時(shí)間復(fù)雜度隨便一個(gè)long long都會(huì)吃不消,所以我們用到了米勒羅賓素?cái)?shù)測(cè)試,直接套一個(gè)模板,記得用unsigned long long,因?yàn)榧幢闶莑ong long,加一下也可能會(huì)爆掉,然后就是板子題了,借助這個(gè)題學(xué)了一波新方法來(lái)測(cè)試素?cái)?shù)
上代碼:
#include<iostream> #include<string> #include<cstring> #include<cstdio> #include<algorithm> #include<climits> #include<cmath> #include<cctype> #include<stack> #include<queue> #include<list> #include<vector> #include<set> #include<map> #include<sstream> using namespace std;typedef unsigned long long LL;//懶得改模板了,就直接把這里改了-.-const int inf=0x3f3f3f3f;const int N=1e6+100;LL prime[6]={2,3,5,233,331}; LL qmul(LL a, LL b, LL mod)//快速乘防止爆long long { LL ans=0; while(b) { if(b&1) ans=(ans+a)%mod; a=a*2%mod; b>>=1; } return ans; } LL qpow(LL a, LL b, LL mod) { LL ans=1; while(b){ if(b&1) ans=qmul(ans,a,mod); a=qmul(a,a,mod); b>>=1; } return ans; } bool Miller_Rabin(LL p) { if(p<2) return false; if(p!=2&&p%2==0)return false; LL s=p-1; while(!(s&1))s>>=1; for(int i=0;i<5;++i) { if(p==prime[i]) return 1; LL t=s,m=qpow(prime[i],s,p); while(t!=p-1&&m!=1&&m!=p-1) { m=qmul(m,m,p); t<<=1; } if(m!=p-1&&!(t&1)) return false; } return true; }int main() { // freopen("input.txt","r",stdin);int w;cin>>w;while(w--){LL n;cin>>n;for(LL i=2;i<n;i++)if(Miller_Rabin(i)&&Miller_Rabin(n-i)){printf("%llu %llu\n",i,n-i);break;}}return 0; }?
總結(jié)
以上是生活随笔為你收集整理的2018宁夏邀请赛 - Goldbach(米勒罗宾素数测试)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Pollard_rho算法+Miller
- 下一篇: HDU - 4569 Special e