美丽的n元树
中文题,就不解释题意啦O(∩_∩)O~
分析:
代码如下:
(可能有些繁琐,但是一定对,O(∩_∩)O~~)
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int maxn=1000+10;
int n,d,a[maxn],aa[maxn],ans[maxn],lena,lenaa,lenans,nn;
void multiply(int k){
int s[maxn],p[maxn],q[maxn],lens,lenp=lenaa,lenq;
memset(s,0,sizeof(s)),memset(p,0,sizeof(p)),memset(q,0,sizeof(q));
for(int i=1;i<=lenp;i++)
p[i]=aa[i];
if(k==1){
lens=lenans;
for(int i=1;i<=lens;i++)
s[i]=ans[i];
}
else{
lens=lenaa;
for(int i=1;i<=lens;i++)
s[i]=aa[i];
}
for(int i=1;i<=lens;i++){
int x=0;
for(int j=1;j<=lenp;j++)
q[i+j-1]=s[i]*p[j]+x+q[i+j-1],x=q[i+j-1]/10,q[i+j-1]%=10;
q[i+lenp]=x;
}
lenq=lens+lenp;
while(q[lenq]==0&&lenq>1)
lenq--;
if(k==1){
lenans=lenq;
for(int i=1;i<=lenq;i++)
ans[i]=q[i];
}
else{
lenaa=lenq;
for(int i=1;i<=lenq;i++)
aa[i]=q[i];
}
}
void Minus(){
int q[maxn],lenq;
memset(q,0,sizeof(q));
int i=0;
while(i<=lenans||i<=lena){
i++;
if(ans[i]<a[i])
ans[i]+=10,ans[i+1]--;
q[i]=ans[i]-a[i];
}
lenq=i;
while((q[lenq]==0)&&(lenq>1))
lenq--;
for(int i=lenq;i>=1;i--)
cout<<q[i];
cout<<endl;
}
int main(){
scanf("%d%d",&n,&d);
lenans=1,ans[1]=1;
for(int i=1;i<=d;i++){
lena=lenans;
for(int j=1;j<=lenans;j++)
a[j]=ans[j];
nn=n,ans[1]=1,lenans=1;
lenaa=lena;
memcpy(aa+1,a+1,sizeof(int)*(lena));
while(nn>0){
if(nn%2==1)
multiply(1);
nn/=2,multiply(2);
}
ans[1]++;
int s=1;
while(ans[s]>9){
if(ans[s+1]==0)
lenans++,ans[s+1]=1,ans[s]%=10;
else
ans[s+1]++,ans[s]%=10;
}
}
Minus();
return 0;
}
by >o< neighthorn