hihocoder1033交错和
题目链接
坑:
1.ll x,y;
z=x*y;可能会溢出,于是我写成x%mod*y%mod
仍旧错误,要写成x%mod*(y%mod).
2.f(9019)=1.
要注意如果为0,下一位的符号根据0的个数而变化
#include<iostream> #include<stdio.h> #include<algorithm> #include<queue> #include<math.h> #include<string.h> #include<string> #include<stdlib.h> using namespace std; typedef long long ll; typedef unsigned long long ull; #define re(i,n) for(int i=0;i<n;i++) ; /* Node cnt表示个数,sum表示和 */ struct Node{ ll cnt, sum; Node() :cnt(), sum(){} Node(ll c, ll s) :cnt(c), sum(s){} }dp[][][][];//(bits,+-,+-can change,sum) /* 19 最多19位 2 +还是- 2 是否是第一个数字 600 f(n)的结果,因为19位*9=171,输入的k是-100到100,所以范围大概是-300到+300,所以用600 */ ll ten[]; //ten[i]表示10^i void init(){ ten[] = ; ; i < ; i++){ ten[i] = * ten[i - ]; } } /*d是一个大管家,管理者dp这个数组,如果计算过,那就不再计算了 对参数做一些处理,像适配器一样 n表示[0,10^n-1]范围内,第一个符号为flag,符号是否会改变change,f(n)=k */ Node d(int n, int flag, int change, int k){ ? : ); ; Node f(ll,int, int, int); ){ dp[n][ff][change][kk] = f(ten[n] - , flag, change, k); } return dp[n][ff][change][kk]; } /* 主要逻辑都在这个函数里面,n表示[0,n]范围内的值 */ Node f(ll n, int flag, int change, int k){ ), ); ){ && flag*k <= n), flag*k); , ); } ll mi = , h = ; )h = tmp % , mi++; mi--; ll va = h*ten[mi];//处理清楚最高位 Node t = d(mi, change ? : -flag, change, k); //第一位为0时,有多少种情况 Node ans = t; ; i < h; i++){ t = d(mi, -flag, , k - flag*i); ans.cnt += t.cnt; ans.sum = (ans.sum + ten[mi]%mod*i*( t.cnt%mod) + t.sum) % mod; } //第一位为h时的情况 )?flag:-flag); ){ ff *= -; } t = f(n - va, ff, , k - flag*h); ans.cnt += t.cnt; ans.sum = (ans.sum + va%mod*(t.cnt%mod) + t.sum) % mod; return ans; } int main(){ //freopen("in.txt", "r", stdin); init(); memset(dp, -, sizeof(dp)); ll l, r, k; cin >> l >> r >> k; Node m = f(l - , ,, k), n = f( r, ,, k); ll ans = (n.sum - m.sum) % mod; )ans += mod; cout << ans << endl; ; }
别人的代码还精简,算法更好.
struct node { ll cnt,sum; //分别表示该状态的出现的次数,以及数字和 node(ll _cnt,ll _sum):cnt(_cnt),sum(_sum){} node(){} }dp[][][]; //dp[i][j][k],表示当前在的i位,第一位有效位为j,交错和为k-100的状态 ll num[]; ll ten[]; ll l,r; int k; node dfs(int cur,int first,int sum,bool limit) { ) ); ].cnt != -) ]; ; node ret(,),tv; rep(i,up+) { int g; ? : cur); } else g = first; if(g) tv = dfs(cur-,g,sum+((g-cur)%==?:-)*i,limit && i == up); else tv = dfs(cur-,,,limit && i==up); ll t = i*ten[cur-]%mod; ret.cnt = (ret.cnt + tv.cnt) % mod; //次数相加 ret.sum = (ret.sum + tv.sum + t*tv.cnt)%mod; //和相加 } ] = ret; return ret; } ll solve(ll n) { ) ; ; while(n){ num[++len] = n % ; n /= ; } ,,).sum; } void init() { memset(dp,-,sizeof(dp)); ten[] = ; ;i<;i++) ten[i] = (ten[i-] * ) % mod; } int main() { #ifndef ONLINE_JUDGE freopen("in.txt","r",stdin); // freopen("out.txt","w",stdout); #endif init(); while(~scanf("%lld%lld%d",&l,&r,&k)) { cout<<(solve(r)-solve(l-)+mod)%mod<<'\n'; } ; }
hihocoder1033交错和的更多相关文章
- hihoCoder1033 交错和 数位DP
题目:交错和 链接:http://hihocoder.com/problemset/problem/1033# 题意:对于一个十进制整数x,令a0.a1.a2.....an是x从高位到低位的数位,定义 ...
- 【hihoCoder】1033: 交错和
初探数位dp 介绍了数位类统计的基础知识.以下列出其中的基础点: 基本问题 统计在区间[l, r]中满足条件的数的个数 思路 1. [l, r] 将问题转换为 在[0, r]中满足条件的个数 - 在[ ...
- hiho#1033 : 交错和
描述 给定一个数 x,设它十进制展从高位到低位上的数位依次是 a0, a1, ..., an - 1,定义交错和函数: f(x) = a0 - a1 + a2 - ... + ( - 1)n - 1a ...
- hihoCoder #1033 : 交错和 (数位Dp)
题目大意: 给定一个数 x,设它十进制展从高位到低位上的数位依次是 a0, a1, ..., an - 1,定义交错和函数: f(x) = a0 - a1 + a2 - ... + ( - 1)n - ...
- [hihocoder 1033]交错和 数位dp/记忆化搜索
#1033 : 交错和 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描写叙述 给定一个数 x,设它十进制展从高位到低位上的数位依次是 a0, a1, ..., an - 1 ...
- hihoCoder 1033 : 交错和 数位dp
思路:数位dp,dp(i, j, k)表示考虑i位数,每位数可以任意取[0~9],并且这i位数的交错和为j,k=1表示前缀全是0(如000456),k=0表示前缀不为0.注意,前缀是否为0是这道题的一 ...
- hihoCoder 1033: 交错和
(1)题目描述: 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个数 x,设它十进制展从高位到低位上的数位依次是 a0, a1, ..., an - 1,定义交错 ...
- HihoCoder 1033交错和(数位DP第三题)
(写挂了,有空再补) 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个数 x,设它十进制展从高位到低位上的数位依次是 a0, a1, ..., an - 1,定义 ...
- 【FJWC2017】交错和查询 [线段树]
交错和查询 Time Limit: 10 Sec Memory Limit: 256 MB Description 无限循环数字串S由长度为n的循环节s构成.设s为12345(n=5),则数字串S为 ...
随机推荐
- Ineedle驱动方式dpdk测试性能
这次主要是测试在dpdk方案下,ineedle的处理包的性能. 发包工具: 使用立永当时写的一个发包工具:linux_pcap 做法:大概是从网上抓取了一些数据包,将源ip替换为随即ip,sip替换为 ...
- Android UI编程(1)——九宫格(GridView)
(转自:http://blog.csdn.net/Thanksgining/article/details/42968847) 参考博客:http://blog.csdn.net/xyz_lmn/ar ...
- Android 播放电影时滑动屏幕调整屏幕亮度(转)
(转自:http://blog.csdn.net/piaozhiye/article/details/6544450) 发现有一些主流的播放器播放电影时可以通过滑动屏幕调整屏幕亮度,其实实现起来也很容 ...
- strip的用法
函数原型 声明:s为字符串,rm为要删除的字符序列 s.strip(rm) 删除s字符串中开头.结尾处,位于 rm删除序列的字符 s.lstrip(rm) 删除s字符串中开头 ...
- CentOS 6.4下Squid代理服务器的安装与配置
一.简介 代理服务器英文全称是Proxy Server,其功能就是代理网络用户去取得网络信息. Squid是一个缓存Internet 数据的软件,其接收用户的下载申请,并自动处理所下载的数据.当一个用 ...
- LED应用照明产品常识关键点
一.基本关注点 1. 寿命LIFE(影响灯具寿命主要因素:热管理.工作温度.工作电压.电源.LED结温) 2. 色彩COLOR(新的LED材料以及改进的生产工艺使得高亮度LED可以生产覆盖整个可见 ...
- 分享——张南《从Desktop到Mobile的自动化测试实践》
张南在top100summit(14年)上分享了google从Desktop到Mobile的自动化测试实践,这里分享一下 案例简述 随着每年移动用户量的增长,移动网络速度以及覆盖力的增强,移动设备逐年 ...
- 基于SPSS的美国老年夏季运动会运动员数据分析
本文是课程训练的报告,部分图片由于格式原因并没有贴出,有兴趣者阅读完整报告者输入以下链接 http://files.cnblogs.com/files/liugl7/基于SPSS的老 ...
- C#中Abstract和Virtual
C#中Abstract和Virtual 在C#的学习中,容易混淆virtual方法和abstract方法的使用,现在来讨论一下二者的区别.二者都牵涉到在派生类中与override的配合使用. 一.Vi ...
- SQL部分 数据库的建立 增删改查
数据库: 结构化查询语言(Structured Query Language)简称SQL: 数据库管理系统(Database Management System)简称DBMS: 数据库管理员(Data ...