题解:

迭代,一次次k累加计算

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=;
int n,a[N],b[N],c[][N],ans[N];
char s[N];
bool same(int p[],int q[],int x)
{
for(int i=;i<=x;i++)
if(p[i]!=q[i])return ;
return ;
}
void multi_1(int x)
{
int last=;
for(int i=;i<=ans[];i++)
{
ans[i]=ans[i]*x+last;
last=ans[i]/;ans[i]%=;
}
if(last>)ans[++ans[]]=last;
}
void multi_2(int w[],int p[],int q[])
{
int i,last=;
w[]=min(p[]+q[]-,n);
for(int k=;k<=w[];k++)
{
for(w[k]=last,i=;i<=p[];i++)
if(k+-i>=&&k+-i<=q[])w[k]+=p[i]*q[k+-i];
last=w[k]/,w[k]%=;
}
if(last)w[++w[]]=last;
}
int get(int x)
{
memcpy(c[],b,sizeof(b));
for(int i=;i<=;i++)
{
multi_2(c[i&],c[i&^],b);
if(same(c[i&],b,x))
{
multi_2(c[i&],c[i&^],a);
if(!same(c[i&],a,x))goto d1;
memcpy(b,c[i&^],sizeof(c[]));
return i;
}
}
d1:puts("");
exit();
}
int main()
{
scanf("%s%d",s,&n);
a[]=strlen(s),n=min(a[],n);
for(int i=;i<=n;i++)a[i]=s[a[]-i]-'';
memcpy(b,a,sizeof(a));
ans[]=;ans[]=;
for(int i=;i<=n;i++)multi_1(get(i));
ans[]++;
int j=;
while (ans[j]==)
{
ans[j+]++;
ans[j]=;
j++;
}
if (ans[ans[]+])ans[]++;
for(int i=ans[];i;i--)printf("%d",ans[i]);
}
05-04 12:19