bzoj 1026 windy数

来源:互联网 发布:文艺的句子 知乎 编辑:程序博客网 时间:2024/04/26 21:18

1026: [SCOI2009]windy数
Time Limit: 1 Sec Memory Limit: 162 MB
Submit: 7359 Solved: 3321
[Submit][Status][Discuss]
Description

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

Input

  包含两个整数,A B。

Output

  一个整数

Sample Input

【输入样例一】

1 10

【输入样例二】

25 50

Sample Output

【输出样例一】

9

【输出样例二】

20

HINT

【数据规模和约定】

100%的数据,满足 1 <= A <= B <= 2000000000 。


【分析】
不计前导0需要分类讨论一下…


【代码】

//bzoj 1026 windy数 #include<cmath>#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#define ll long long#define M(a) memset(a,0,sizeof a)#define fo(i,j,k) for(i=j;i<=k;i++)using namespace std;int a,b;ll dp[15][10],digit[15];inline ll work(int n){    memset(digit,0,sizeof digit);    ll len=0,ans=0,i,j,k;    while(n) digit[++len]=n%10,n/=10;    fo(j,1,digit[len]-1) ans+=dp[len][j];    for(i=len-1;i>=1;i--)      fo(j,1,9) ans+=dp[i][j];    for(i=len-1;i>=1;i--)    {        fo(j,0,digit[i]-1)        {            if(abs(digit[i+1]-j)>=2)              ans+=dp[i][j];        }        if(abs(digit[i+1]-digit[i])<2) break;    }    return ans;}int main(){    ll i,j,k;    fo(i,0,9) dp[1][i]=1;    fo(i,2,11)      fo(j,0,9)        fo(k,0,9)          if(abs(j-k)>=2)            dp[i][j]+=dp[i-1][k];    scanf("%d%d",&a,&b);    printf("%lld\n",work(b+1)-work(a));    return 0;}
0 0