您的位置:首页 > 其它

poj 1850 1019 (简单位数dp)

2016-07-05 14:42 323 查看
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int f[27][11],l,ans;
char s[11];
void Get_f()
{
for(int i=1;i<=26;i++)
f[i][1]=1;
for(int j=2;j<=10;j++)
for(int i=1;i<=26;i++)
for(int k=i+1;k<=26;k++)
f[i][j]+=f[k][j-1];
}
int main()
{
scanf("%s",s+1);
l=strlen(s+1);s[0]=96;
for(int i=2;i<=l;i++)
if(s[i]<=s[i-1])
{
printf("0\n");
return 0;
}
Get_f();
for(int i=1;i<=26;i++)
for(int j=1;j<l;j++)
ans+=f[i][j];
for(int i=1;i<=l;i++)
for(int j=s[i-1]-95;j<s[i]-96;j++)
ans+=f[j][l+1-i];
printf("%d\n",ans+1);
return 0;
}


#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 100010
using namespace std;
int T,n;
long long s[maxn+10],a[maxn+10];
void Get_sa()
{
for(int i=1;i<=maxn;i++)
{
int t=i,l=0;
while(t)l++,t/=10;
a[i]=a[i-1]+l;
s[i]=s[i-1]+a[i];
}
}
int main()
{
Get_sa();
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
int i=1;
while(n>s[i])i++;
n-=s[i-1];i=1;
while(n>a[i])i++;
n-=a[i-1];
int data[10],l=0;
memset(data,0,sizeof(data));
while(i)
{
data[++l]=i%10;
i=i/10;
}
printf("%d\n",data[l-n+1]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: