hdu 2964 Prime Bases

来源:互联网 发布:linux cp 目录 编辑:程序博客网 时间:2024/05/16 19:16

思路:只需要9个素数,然后将连乘的部分预处理,从最大的一个连乘数开始,用n去除,倍数就是这个连乘数前面的那个数,余数继续后面的计算


代码:

#include <iostream>#include <stdio.h>#include <string.h>#include <math.h>#include <stdlib.h>#include <map>#include <set>#include <vector>#include <stack>#include <queue>#include <algorithm>using namespace std;#define mst(a,b) memset(a,b,sizeof(a))#define eps 10e-8const int MAX_ = 10010;const int N = 10010;const int INF = 0x7fffffff;const int M = 1000000000;int prime[MAX_];long long a[MAX_];int b[MAX_];int n, ok, flag;int PrimeTable(int prime[]) { //打印素数表    int pNum=0;    prime[pNum++]=2;    for(int i=3; i<=N; i+=2) { //奇偶法        bool flag=true;        for(int j=0; prime[j]*prime[j]<=i; j++) //根号法+递归法            if(!(i%prime[j])) {                flag=false;                break;            }        if(flag)            prime[pNum++]=i;    }    return pNum;}int main() {    int T, cnt, p1,p2, mini, num = 1;    long long tmp =1;    cnt = PrimeTable(prime);    a[0] = 1;    for(int i = 0; i <= 9; ++i){        tmp *= prime[i];        a[num++] = tmp;        //if(tmp > M)break;    }    while(cin>>n,n) {        ok = 0;        printf("%d = ", n);        cnt = 0;        //memset()        for(int i = 9; i > -1; --i){            b[i] = n/a[i];            n %= a[i];            if(b[i])            ++cnt;        }        for(int i = 0; i <= 9; ++i){            if(b[i]){                printf("%d",b[i]);                for(int j = 0; j < i; ++j){                    printf("*%d",prime[j]);                }                --cnt;                if(cnt)printf(" + ");            }        }        printf("\n");    }    return 0;}


0 0
原创粉丝点击