1 题意
2 分析
注意如果得到的余数和除数幂次相同也要继续除,知道余数的幂小于除数或者余数为0(整除)!
注意题目输入和输出都是从低次幂开始的!
代码一针对此题,代码二按部就班。
3
代码一
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <algorithm>
using namespace std;
const int maxn=1e4+10;
int a[maxn],h[maxn];// 多项式a/多项式b
int main()
{
//freopen("out.txt","w",stdout);
int n,k;
while(~scanf("%d%d",&n,&k)){
if(n==-1&&k==-1) break;
for(int i=0;i<=n;i++)
a[i]=0;
for(int i=0;i<=n;i++){
scanf("%d",&a[i]);
}
for(int i=n;i>=k;i--){
if(a[i]!=0){
a[i-k]-=(a[i]);
a[i]=0;
}
}
while(a[n]==0&&n>=0){
n--;
}
for(int i=0;i<n;i++){
cout<<a[i]<<" ";
}
cout<<a[n]<<endl;
}
return 0;
}
代码二
//假设多项式每次相除得到的商总是整数,对于此题肯定符合
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <algorithm>
using namespace std;
const int maxn=1e4+10;
int a[maxn],h[maxn];// 多项式a/多项式b
int Compare(int la,int lh){
if(la>=lh) return 1;
else if(la<lh) return 0;
}
int main()
{
//freopen("out.txt","w",stdout);
int n,k;
while(~scanf("%d%d",&n,&k)){
if(n==-1&&k==-1) break;
int la=-1,lh=k;
for(int i=0;i<=n;i++)
a[i]=h[i]=0;
h[k]=1;h[0]=1;//题目条件
for(int i=0;i<=n;i++){
scanf("%d",&a[i]);
}
for(int i=n;i>=0;i--){
if(la==-1&&a[i]!=0){
la=i;
break;
}
}
while(Compare(la,lh)>0){///余数和除数最高次幂相同时要继续除,直到余数幂小于除数或者余数为0
int d=la-lh;//商的幂
int s=a[la]/h[lh];//商的系数
for(int i=0;i<=lh;i++){
a[i+d]-=(s*h[i]);
}
for(int i=la;i>0;i--){//la最低到1
if(a[i]==0) la--;
else break;
}
if(la==0&&a[0]==0){
break;
}
}
for(int i=0;i<la;i++){
cout<<a[i]<<" ";
}
cout<<a[la]<<endl;
}
return 0;
}