1. 程式人生 > 實用技巧 >thinkphp6 的簡訊驗證碼生成、驗證類庫

thinkphp6 的簡訊驗證碼生成、驗證類庫

題目連結Miku

數論dp的典型例題

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int dp[1001][15];

//事實上,對於此dp還有個限制
//沒有任何限制條件 
int l[1001];
int c;
int p;
int p2;

long long dfs(int pos,int pre,int leadz,int li){
	//當前位置,前一位置,有無前道零,有無限制 
	int ret=0;
	if(pos>p2)
	return 1;
	if(dp[pos][pre]!=-1&&leadz==0&&li==0){
		return dp[pos][pre];
	}
	int lim=li?  l[p2-pos+1] :9;
	//能列舉到那個數由限制決定 
	for(int i=0;i<=lim;++i){
		if(i==0&&leadz) ret+=dfs(pos+1,i,1,i==lim&&li);
		else
		if(i&&leadz) ret+=dfs(pos+1,i,0,i==lim&&li);
		else
		if(abs(pre-i)>=2)
		ret+=dfs(pos+1,i,0,i==lim&&li);
	}
	if(leadz==0&&li==0)
	dp[pos][pre]=ret;
	return ret;
}
long long solve(int p){
	p2=0;
	while(p>0){
		l[++p2]=p%10;
		p/=10; 
	}
	memset(dp,-1,sizeof(dp));
	return dfs(1,0,1,1);
}
int main(){
	cin>>p>>c;
	cout<<solve(c)-solve(p-1);
	return 0;
}