这题我按照1,k,k(k+1)的初始值bfs按规律累加,小数据手算了一下应该没错,极限数据也没超100位,但是交上去就WA(wrong answer '3' appears more than once!),不知道什么原因,求调!
#include<bits/stdc++.h>
using namespace std;
struct huge_int{
int len,num[1005];
};
huge_int huge_change(int m){
huge_int a;
a.len=0;
memset(a.num,0,sizeof(a.num));
while (m!=0){
a.len++;
a.num[a.len-1]=m%10;
m/=10;
}
return a;
}
huge_int huge_add(huge_int a,huge_int b){
huge_int c;
c.len=max(a.len,b.len);
memset(c.num,0,sizeof(c.num));
for (int i=0;i<c.len;i++){
c.num[i]=a.num[i]+b.num[i];
}
for (int i=0;i<c.len-1;i++){
if (c.num[i]>=10){
c.num[i+1]+=c.num[i]/10;
c.num[i]%=10;
}
}
if (c.num[c.len-1]>=10){
c.num[c.len]+=c.num[c.len-1]/10;
c.num[c.len-1]%=10;
c.len++;
}
return c;
}
huge_int huge_minus(huge_int a,huge_int b){
huge_int c;
c.len=a.len;
memset(c.num,0,sizeof(c.num));
for (int i=0;i<c.len;i++){
c.num[i]=a.num[i]-b.num[i];
}
for (int i=0;i<c.len-1;i++){
if (c.num[i]<0){
c.num[i+1]--;
c.num[i]+=10;
}
}
while (c.num[c.len-1]==0){
c.len--;
}
return c;
}
huge_int multiply(huge_int a,huge_int b){
huge_int ans;
memset(ans.num,0,sizeof(ans.num));
ans.len=a.len+b.len-1;
for (int i=0;i<a.len;i++){
for (int j=0;j<b.len;j++){
ans.num[i+j]+=a.num[i]*b.num[j];
}
}
for (int i=0;i<ans.len;i++){
ans.num[i+1]+=ans.num[i]/10;
ans.num[i]=ans.num[i]%10;
}
if (ans.num[ans.len]>0){
ans.len++;
}
return ans;
}
void huge_print(huge_int a){
for (int i=a.len-1;i>=0;i--){
printf("%d",a.num[i]);
}
}
struct group{
huge_int a,b,c;
};
void bfs(int k,int n){
queue<group> q;
group g;
g.a=huge_change(1);
g.b=huge_change(k);
g.c=huge_change(k*(k+1));
q.push(g);
for (int i=0;i<n;i++){
group cg;
cg=q.front();
q.pop();
huge_print(cg.a);
printf(" ");
huge_print(cg.b);
printf(" ");
huge_print(cg.c);
printf("\n");
group ng;
ng.a=cg.b;
ng.b=cg.c;
ng.c=huge_minus(multiply(huge_change(k),huge_add(cg.b,cg.c)),cg.a);
q.push(ng);
ng.a=cg.a;
ng.b=cg.c;
ng.c=huge_minus(multiply(huge_change(k),huge_add(cg.a,cg.c)),cg.b);
q.push(ng);
}
}
int main(){
int k,n;
scanf("%d%d",&k,&n);
bfs(k,n);
return 0;
}