列表

详情


NC50518. Windy 数

描述

Windy定义了一种Windy数:不含前导零且相邻两个数字之差至少为2的正整数被称为Windy数。
Windy想知道,在A和B之间,包括A和B,总共有多少个Windy数?

输入描述

一行两个数,分别为A,B。

输出描述

输出一个整数,表示答案。

示例1

输入:

1 10

输出:

9

示例2

输入:

25 50

输出:

20

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

pypy3 解法, 执行用时: 161ms, 内存消耗: 27112K, 提交时间: 2023-06-09 20:08:01

from functools import lru_cache
mod = int(1e9) + 7
@lru_cache(None)
def solve(n):
    s = str(n)
    @lru_cache(None)
    def f(i,mask ,is_limit, is_num):
        if i == len(s):
            return int(is_num)
        res = 0
        if not is_num:
            res = f(i + 1, 0, False, False)
        low = 1 - int(is_num)
        up = int(s[i]) if  is_limit else 9
        for d in range(low, up + 1):
            if not is_num:
                res +=  f(i + 1, d, is_limit and d == up, True)
            elif abs(d - mask) >= 2:
                res += f(i + 1, d, is_limit and d == up, True)
        return res
    return f(0,0,True,False)


l, r = map(int,input().split())
print(solve(r) - solve(l - 1))

C++ 解法, 执行用时: 3ms, 内存消耗: 424K, 提交时间: 2022-06-08 13:03:06

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll f[20][12]={0};
int Dim[20]={0};
ll DFS(int x,int pre,int bj)
{
	if(!x)return 1;
	if(!bj&&f[x][pre]!=-1)return f[x][pre];
	int maxn=bj?Dim[x]:9;
	ll temp=0;
	for(int i=0; i<=maxn; i++)
	{
		if(abs(pre-i)<2)continue;
		if(pre==11&&i==0)
		temp+=DFS(x-1,11,bj&&i==maxn);
		else temp+=DFS(x-1,i,bj&&i==maxn);
	}
	if(!bj)f[x][pre]=temp;
	return temp;
}
ll Ask(ll x)
{
	Dim[0]=0;
	while(x)
	{
		Dim[++Dim[0]]=x%10;
		x/=10;
	}
	Dim[Dim[0]+1]=0;
	return DFS(Dim[0],11,1);
}
int main()
{
	ll a,b;
	memset(f,-1,sizeof(f));
	cin>>a>>b;
	cout<<Ask(b)-Ask(a-1)<<endl;
    return 0;
}

上一题