USACO Training Section1.5 Superprime Rib

本文介绍了一个简单的程序,用于计算超级素数。通过优化算法减少运算量,并使用MillerRabin算法进行素数测试。代码实现了一次编译和一次AC。
简单不过的程序,超级素数的计算。注意最高位可选的数与其他位有所不同,其他位的数字可排除偶数,减少运算量。一次编译,一次AC。

顺便查了下作素数测试的Miller Rabin算法,随机算法学过很久很久了,这算是经典的一个。

原题链接:
[url]http://ace.delos.com/usacoprob2?a=bFftpewR5eD&S=sprime[/url]


/*
ID: blackco3
TASK: sprime
LANG: C++
*/
#include <fstream>
#include <math.h>
using namespace std;

int prime[]={2,3,5,7}, n_prime=4 ;
int org[]={1,3,5,7,9}, n_org=5 ;
int n_digit ;
ofstream fout("sprime.out");

inline int is_prime(int num) {
for( int i=2; i*i<=num; i++)
if( !(num%i) )
return 0;
return 1;
}

void get_sprime(int rank, int cur)
{
if( rank==n_digit ){
fout << cur << endl ;
return ;
}
for( int i=0; i<n_org; i++ ){
int next = cur*10+org[i] ;
if( is_prime(next) )
get_sprime(rank+1,next);
}
}

int main()
{
ifstream fin("sprime.in");
fin >> n_digit ;
int cur_sum ;
for( int i=0; i<n_prime; i++){
cur_sum=prime[i] ;
get_sprime(1,cur_sum);
}

return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值