这道题和不要62那道题有些类似,这道题是不要出现连续的49。
思路大致一样,只是在对f数组进行初始化的时候,我们需要求的是数中不含有49的个数,然后最后利用n+1-cal(n+1)来求出正确答案,这里与我想的有些不同。
还要注意一点,要全部转化为__int64,要不然的话会WA。
#include<stdio.h>
#include<string.h>
#include<set>
#include<map>
#include<stack>
#include<queue>
#include<math.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 103
typedef __int64 ll;
ll f[maxn][maxn];
ll dig[maxn];
void init(){
f[0][0]=1;
for(int i=1;i<=20;i++){
for(int j=0;j<=9;j++){
for(int k=0;k<=9;k++){
if(j==4&&k==9) continue;
f[i][j]=f[i][j]+f[i-1][k];
}
}
}
}
ll cal(ll x){
ll tmp=x,t=0;
while(tmp){
dig[++t]=tmp%10;
tmp=tmp/10;
}
dig[t+1]=0;
ll ans=0;
for(int i=t;i>=1;i--){
for(int j=0;j<dig[i];j++){
if(!(dig[i+1]==4&&j==9)) ans+=f[i][j];
}
if(dig[i+1]==4&&dig[i]==9) break;
}
return ans;
}
int main(){
ll T,n;
init();
while(~scanf("%I64d",&T)){
while(T--){
scanf("%I64d",&n);
ll res=cal(n+1);
printf("%I64d\n",n+1-res);
}
}
}
解决数字序列中避免连续出现特定数字的算法问题
本文探讨了一种算法解决方案,用于计算一个数字序列中不包含连续出现特定数字(如49)的序列数量。通过初始化一个二维数组`f`并进行迭代计算,最终使用`cal`函数计算出满足条件的序列总数。同时强调了将所有变量转换为`__int64`类型的重要性,以避免溢出错误。
9275

被折叠的 条评论
为什么被折叠?



