杭电 “Prime Bases ”解题报告

来源:互联网 发布:最新省市区数据库 编辑:程序博客网 时间:2024/05/18 01:54

Prime Bases

Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 26   Accepted Submission(s) : 7

Font: Times New Roman | Verdana | Georgia

Font Size:

Problem Description

Given any integer base b >= 2, it is well known that every positive integer n can be uniquely represented in base b. That is, we can write

n = a0 + a1*b + a2*b*b + a3*b*b*b + ...

where the coefficients a0, a1, a2, a3, ... are between 0 and b-1 (inclusive).

What is less well known is that if p0, p1, p2, ... are the first primes (starting from 2, 3, 5, ...), every positive integer n can be represented uniquely in the "mixed" bases as:

n = a0 + a1*p0 + a2*p0*p1 + a3*p0*p1*p2 + ...

where each coefficient ai is between 0 and pi-1 (inclusive). Notice that, for example, a3 is between 0 and p3-1, even though p3 may not be needed explicitly to represent the integer n.

Given a positive integer n, you are asked to write n in the representation above. Do not use more primes than it is needed to represent n, and omit all terms in which the coefficient is 0.

Input

Each line of input consists of a single positive 32-bit signed integer. The end of input is indicated by a line containing the integer 0.

Output

For each integer, print the integer, followed by a space, an equal sign, and a space, followed by the mixed base representation of the integer in the format shown below. The terms should be separated by a space, a plus sign, and a space. The output for each integer should appear on its own line.

Sample Input

1234561234560

Sample Output

123 = 1 + 1*2 + 4*2*3*5456 = 1*2*3 + 1*2*3*5 + 2*2*3*5*7123456 = 1*2*3 + 6*2*3*5 + 4*2*3*5*7 + 1*2*3*5*7*11 + 4*2*3*5*7*11*13

Source

2008 Rocky Mountain Regional 


解题思路:
本题是简单的数论题,数据处理量也不大,不用担心超时的问题,用一个数组prime[]将29及以下的素数全存储起来,然后将素数累乘的积及最大系数+1(这里还没减去,在后面处理)放入一个二维数组sum中。
处理输入数据时,定义一个二维数组a,存放是否使用对应sum中该位置的值是否使用,未使用则继续,使用则减去该存放的值,在a【1】中第一个位置存放1,第二个位置存放系数。循环,在控制输出,就可以了。
本来素数到23就可以了,但是为什么要写到29,思考一下。可能不一定用到,但是我没算,细心的朋友算一下。

代码如下:
#include <iostream>using namespace std;int main(){int n,i,j;//数据预处理int prime[]={2,3,5,7,11,13,17,19,23,29};__int64 sum[10][2],tempcount=1,tempnum=1;for(i=0,j=0;i<10;i++){sum[i][0]=tempcount;sum[i][1]=tempnum;tempnum=prime[j]-1;tempcount*=prime[j++];}//数据处理while(cin>>n){int out=n;if(n==0)break;int a[10][2]={0};i=9;while(n!=0){if(n>=sum[i][0]){for(j=prime[i+1]-1;j>0;j--){tempcount=j*sum[i][0];if(tempcount<=n){a[i][0]=1;a[i][1]=j;n-=tempcount;break;}}}else{a[i][0]=0;a[i][1]=0;}i--;}//控制输出cout<<out<<" = ";int outcount=0;for(i=0;i<10;i++){if(a[i][0]==1){if(i==0){cout<<"1";outcount++;}else{if(outcount!=0)cout<<" + ";cout<<a[i][1]<<"*";for(j=0;j<i;j++){cout<<prime[j];if(j!=i-1)cout<<"*";}outcount++;}}}cout<<endl;}return 0;}


原创粉丝点击