poj 1850 1019 (简单位数dp)

时间:2023-11-24 17:02:14
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int f[][],l,ans;
char s[];
void Get_f()
{
for(int i=;i<=;i++)
f[i][]=;
for(int j=;j<=;j++)
for(int i=;i<=;i++)
for(int k=i+;k<=;k++)
f[i][j]+=f[k][j-];
}
int main()
{
scanf("%s",s+);
l=strlen(s+);s[]=;
for(int i=;i<=l;i++)
if(s[i]<=s[i-])
{
printf("0\n");
return ;
}
Get_f();
for(int i=;i<=;i++)
for(int j=;j<l;j++)
ans+=f[i][j];
for(int i=;i<=l;i++)
for(int j=s[i-]-;j<s[i]-;j++)
ans+=f[j][l+-i];
printf("%d\n",ans+);
return ;
}
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 100010
using namespace std;
int T,n;
long long s[maxn+],a[maxn+];
void Get_sa()
{
for(int i=;i<=maxn;i++)
{
int t=i,l=;
while(t)l++,t/=;
a[i]=a[i-]+l;
s[i]=s[i-]+a[i];
}
}
int main()
{
Get_sa();
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
int i=;
while(n>s[i])i++;
n-=s[i-];i=;
while(n>a[i])i++;
n-=a[i-];
int data[],l=;
memset(data,,sizeof(data));
while(i)
{
data[++l]=i%;
i=i/;
}
printf("%d\n",data[l-n+]);
}
return ;
}