博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
有关按位DP
阅读量:5129 次
发布时间:2019-06-13

本文共 945 字,大约阅读时间需要 3 分钟。

     这是一道正式比赛的题目 数据范围是 10^999 ~ 10^1000 的两个整数以及一个k我记得好像是不超过100,计算两个数中间有多少个每一位相乘最后和k取摸等于0的数。这道题对于不会按位dp的人是一道很难的题。但是如果会按位dp的话那是一道很容易的题。

     先看看这个问题 在int能够存下的两个数中间有多少个每一位相加最后和k取摸等于0的数。首先枚举每一位从低位向高位枚举,每一位有10种取值 0,1,2,3,4,5,6,7,8,9,dp[i][j][p] 代表枚举到第i为最后摸k等于j的个数p代表是否可能会超过这一位,一层层的枚举就可以求得最终答案。

#include 
#include
#include
#include
#include
#include
using namespace std;typedef int LL;char a[22];char b[22];int dp[22][99][4];int main(){ int i,j,d,p,s; int n; LL A,B; int ans; while(scanf("%d %d %d",&A,&B,&n)==3) { sprintf(b,"%021d",A); sprintf(a,"%021d",B); memset(dp,0,sizeof(dp)); for (i=0;a[i];++i) a[i]-='0',b[i]-='0'; dp[0][0][3]=1; ans=0; for (i=0;i<20;i++) { for (j=0;j
a[i+1]) continue; if ((p&2)&&s

  如果这个问题会了的话那之前的问题就很容易解决了,从时间复杂度上看1000位的数字都是浮云,前面的999只是想让那些想打表找规律的人望而却步而已。

转载于:https://www.cnblogs.com/MengYan-LongYou/p/3171018.html

你可能感兴趣的文章
oracle 创建暂时表
查看>>
201421410014蒋佳奇
查看>>
导入导出数据库和导入导出数据库表
查看>>
linux下操作mysql
查看>>
【03月04日】A股滚动市盈率PE历史新低排名
查看>>
总结:Bias(偏差),Error(误差),Variance(方差)及CV(交叉验证)
查看>>
iOS7 界面适配-NavigationBar StateBar
查看>>
用canvas上传图片
查看>>
五子棋-开发环境搭建过程
查看>>
Java数据结构与算法解析(三)——队列与背包
查看>>
Xcode5和ObjC新特性
查看>>
.Net Discovery 系列之二--string从入门到精通(下)
查看>>
Loadrunner:录制APP脚本
查看>>
jvm slot复用
查看>>
高并发系统数据库设计
查看>>
js 点击获取验证码后的倒数60s
查看>>
杭电ACM-1.2.3 QuickSum
查看>>
基于mini2440的boa服务器移植
查看>>
我写的第4个程序(日志最近行读取函数)
查看>>
Git使用总结(一):简介与基本操作
查看>>