給定多項式f(x)=anxn+an-1xn-1+…+a0x0,如果an<>0,我們稱f(x)是一個n次多項式。
類似自然數裏的“質數”的概念,也可以給出“質多項式”的概念。給定多項式f(x),如果找不到次數至少爲1的多項式g(x)和h(x)滿足f(x)=g(x)+h(x),我們稱f(x)是質多項式。
爲了簡化起見,我們規定多項式各項的係數只能取兩個數:0或1。並且重新定義在{0,1}上的加法和乘法:
0+0=0,0+1=1,1+0=1,1+1=0
0×0=0,0×1=0,1×0=0,0×0=0
下面給出多項式相乘的例子:
(x2+x1)×(x1+1)=x3+x2+x2+x1=x3+x1
.
在這個問題裏,你需要寫一個程序,對給定的正整數k,求出次數爲k的質多項式的。
Simple input |
Output for the input |
1 2 5 13 0
|
X X^2+X+1 X^5+X^2+1 X^13+X^4+X^3+X^1+1 |
解:
觀察題目可知這裏的的加法運算XOR,其逆運算減法運算也是異或運算XOR。
乘法運算是與運算AND。
於是解題時可以按照窮舉法逐個遍歷,直到找到解爲止。
還有一點需要注意的是K次質多項式必含有X^K和1項。
代碼:
#include<string.h>
#include<stdlib.h>
int bin[31];
inline void
init(){
int i;
bin[0]=1;
for(i=1;i<=30;i++)
bin[i]=bin[i-1]*2; //bin[i]=2^i
}
inline int
weight(int data){ //返回data中第一個非零位的位置
int i=30;
for(;i>=0;i--)
if(bin[i]<=data) return i;
}
inline void
output(int data){
int i;
for(i=30;i>0;i--){
if(data&bin[i]) printf("x^%d+",i);
}
printf("1 ");
}
inline bool
divide(int a,int b){ //判斷b能否整除a
int wa,wb;
wa=weight(a);
wb=weight(b);
b=b<<(wa-wb);
while(a!=b && wa>=wb){
a=a^b; //a=a xor b
while(bin[wa]>a){
--wa;
b=b>>1;
}
}
return wa>=wb? true:false;
}
void
main(){
init();
int k,flag,i,now;
while(1){
scanf("%d",&k);
if(k==0) return;
now=bin[k]-1;
do{
if(now>bin[k+1]) {puts("error");break;}
flag=false;
now+=2;
for(i=2;i<bin[(k+1)/2+1]-1;i++){
if(divide(now,i)==true) {
flag=true;
break;
}
}
}while(flag);
output(now);
}
}