M数 | ||||||
| ||||||
Description | ||||||
Mac最近YY了一种比较特别的整数,这种数有N位并且从左向右每一位的数字是非递减的,此外这个整数可以包含前导0。例如当N=3时,012、011、111等都是符合的,而321、322等则是不符合的。请你计算出长度为N位的整数中有多少个整数符合这种整数的性质。 | ||||||
Input | ||||||
多组测试数据。第一行是一个整数T(0<T<=100),表示测试数据的组数。 接下来的T行,每行一个整数N表示整数的位数。( 1 <= N <= 100000 )
| ||||||
Output | ||||||
对于每组数据输出一个整数表示符合条件的整数的个数,由于答案可能比较大,请把结果对 1000000007取余后输出。 | ||||||
Sample Input | ||||||
2 1 2 | ||||||
Sample Output | ||||||
10 55 |
数位dp的基础、其实也就是预处理问题,因为这里的n范围相当大,所以这个题简化了问题,直接问n位有数上有多少个满足条件的数字串,这里限制条件只有一个:
非递增,那么这个题还是比较好解的,直接dp就行了~:
相对数位dp有一个很不错的入门题推荐给大家:hdu 2089 不要62、
#include<stdio.h>
#include<string.h>
using namespace std;
int dp[100000][10];
void dpdp()
{
for(int i=0;i<10;i++)
{
dp[0][i]=1;
}
for(int i=1;i<=100000;i++)
{
for(int j=0;j<10;j++)
{
for(int k=0;k<10;k++)
{
if(j<=k)
{
dp[i][j]+=dp[i-1][k]%1000000007;
dp[i][j]%=1000000007;
}
}
}
}
}
int main()
{
memset(dp,0,sizeof(dp));
dpdp();
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
printf("%d\n",dp[n][0]);
}
}