题意比较简单吧,,,,,,,前导0不算,,中间有连续的0算不合适,,,,问n位K个有效位的数有多少个?
这题一看要么找规律,要么递推。。。。而且注意到<18所以用 long long
样例就是2位有效数字嘛,,,就是9*10=90啦。。。。(个位0~9,十位1~9)
(这题坑了我半天因为K表示的是位数也是进制!!!!开始全用10进制了、。。。。)
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#include<bits/stdc++.h>
long long dp[20][20];
int main()
{
int n,k;
for(int i=2; i<=18; i++)
{
dp[i][1] = i-1;
dp[i][2] = (i-1)*i;
}
for(int i=2; i<=10; i++)
for(int j=3; j<=18; j++)
dp[i][j] = (i-1)*(dp[i][j-1] + dp[i][j-2]);
while(scanf("%d%d",&n,&k)!=EOF)
{
printf("%lld\n",dp[k][n]);
}
return 0;
}
代码很简单了,,,,,,DP嘛,,,,直接用一两行就找到规律了。。。。。