p2657 windy数
2024-08-27 19:47:55
分析
首先这是一个询问一段区间内的个数的问题,所以我们可以用差分的思想用sum(R)-sum(L-1)。然后我们考虑如何求出sum(n),我们用dp[i][j][k][t]表示考虑到第i位,最后一个数是j,是否已经小于n和是否已经考虑完前导零。至于转移和一般的套路一样,详见代码。注意最后记得考虑n自己。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<ctime>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
long long a[],dp[][][][];
inline long long go(long long n){
if(!n)return ;
long long m=n,i,j,k,cnt=;
long long h=,lo=;
while(){
if(m<h&&m>=lo)break;
h*=,lo*=;
}
while(lo){
a[++cnt]=m/lo;
m%=lo;
lo/=;
}
memset(dp,,sizeof(dp));
dp[][][][]=;
a[]=;
for(i=;i<=cnt;i++){
for(j=;j<=a[i];j++){
k=a[i-];
if(abs(j-k)>=){
if(j<a[i])dp[i][j][][]+=dp[i-][k][][];
else dp[i][j][][]+=dp[i-][k][][];
}
if(!k){
if(j<a[i]&&j)dp[i][j][][]+=dp[i-][][][];
else if(j<a[i]&&!j)dp[i][j][][]+=dp[i-][][][];
else if(!j)dp[i][j][][]+=dp[i-][][][];
else dp[i][j][][]+=dp[i-][][][];
}
}
for(j=;j<=;j++){
for(k=;k<=;k++){
if(abs(j-k)>=){
dp[i][j][][]+=dp[i-][k][][];
}
if(!k){
if(j)dp[i][j][][]+=dp[i-][k][][];
else dp[i][j][][]+=dp[i-][k][][];
}
}
}
}
long long ans=dp[cnt][a[cnt]][][];
for(i=;i<=;i++)
ans+=dp[cnt][i][][];
return ans;
}
int main(){
long long a,b;
scanf("%lld%lld",&a,&b);
cout<<go(b)-go(a-)<<endl;
return ;
}
最新文章
- Oracle碎碎念~1
- CompletionService/ExecutorCompletionService/线程池/concurrent包
- [课程设计]Scrum 1.3 多鱼点餐系统开发进度(系统主界面框架&;美化)
- Erlang数据类型的表示和实现(5)——binary
- java 12-4 StringBuffer类的替换、反转、截取功能
- 创建Android Virtual Device
- NGUI 的使用教程与实例(入门)(1 )
- 课程助理For Windows(预览版,正方教务系统学生查分工具)
- 如何解决ajax跨域问题
- IO库 8.1
- 搭建开源java博客并通过域名访问
- Linux网络配置。Win10能ping虚拟机但虚拟机ping不通Win10,关闭Win10防火墙就好。
- C# WinForm 富文本编辑器 用kindeditor实现本地图片只选取不上传到编辑器
- Django-CRM项目学习(六)-rbac模块(权限组件)
- selenium3+java+POM 跨浏览器测试之------读取配置文件
- 调用wait的SIGCHLD信号处理函数
- MySql数据库学习笔记(1)
- 【leetcode】412. Fizz Buzz
- Codeforces Gym - 101102B - The Little Match Girl
- oracle完全恢复数据库