luoguP2657 [SCOI2009]windy数
Posted achensy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了luoguP2657 [SCOI2009]windy数相关的知识,希望对你有一定的参考价值。
和诸位巨佬不同,蒟蒻如我,只能想到怎么统计不满足windy数条件的数
就是个爆搜
定义c[i][j][k]表示第i位且前一位为j,k表示是否满足条件
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=1e5+5; 4 int tot,e[20]; 5 long long c[20][20][2]; 6 int a,b; 7 template<class t>void red(t &x) 8 9 int w=1; 10 x=0; 11 char ch=getchar(); 12 while(ch>‘9‘||ch<‘0‘) 13 14 if(ch==‘-‘) 15 w=-1; 16 ch=getchar(); 17 18 while(ch>=‘0‘&&ch<=‘9‘) 19 20 x=(x<<3)+(x<<1)+ch-‘0‘; 21 ch=getchar(); 22 23 x*=w; 24 25 void input() 26 27 freopen("input.txt","r",stdin); 28 29 void dv(int x) 30 31 tot=0; 32 while(x) 33 34 e[++tot]=x%10; 35 x/=10; 36 37 e[tot+1]=0; 38 39 long long dfs(int pos,bool limit,bool zero,bool dc,int pre) 40 41 if(pos==0) 42 return dc; 43 if(!limit&&c[pos][pre][dc]!=-1) 44 return c[pos][pre][dc]; 45 int up=limit?e[pos]:9; 46 long long ans=0; 47 for(int i=0;i<=up;++i) 48 ans+=dfs(pos-1,limit&&(i==up),zero||i,dc||(abs(i-pre)<2&&zero),i); 49 if(!limit&&zero) 50 c[pos][pre][dc]=ans; 51 return ans; 52 53 long long solve(int x) 54 55 dv(x); 56 memset(c,-1,sizeof(c)); 57 return dfs(tot,1,0,0,-1); 58 59 void read() 60 61 red(a); 62 red(b); 63 64 void work() 65 66 printf("%lld",b-a+1-solve(b)+solve(a-1)); 67 68 int main() 69 70 input(); 71 read(); 72 work(); 73 return 0; 74
以上是关于luoguP2657 [SCOI2009]windy数的主要内容,如果未能解决你的问题,请参考以下文章