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为 ...
随机推荐
- flock — 轻便的咨询文件锁定
bool flock ( resource $handle , int $operation [, int &$wouldblock ] ) handle 文件系统指针,是典型地由 ...
- EarthWarrior3D游戏ios源码
这是一款不错的ios源码源码,EarthWarrior3D游戏源码, 并且游戏源代码支持多平台. 适用于cocos v2.1.0.0版本 源码下载:http://code.662p.com/view/ ...
- Discuz论坛搬家手记(X3.2版本)
Discuz论坛搬家手记(X3.2版本) 客户在虚拟主机上 运行着一个DISCUZ论坛, 主机商限制太多,连MP3都不让放,客户准备是在上面放一个FLASH斗地主游戏的(多人联机版), 加上MYSQL ...
- JS客户端判断
<script language="javascript" type="text/javascript"> function browserDete ...
- vijos1059 积木城堡[n年浙江省队第X轮](背包的方案总数 or 01背包)
描述 XC的儿子小XC最喜欢玩的游戏用积木垒漂亮的城堡.城堡是用一些立方体的积木垒成的,城堡的每一层是一块积木.小XC是一个比他爸爸XC还聪明的孩子,他发现垒城堡的时候,如果下面的积木比上面的积木大, ...
- Zygote进程【2】——Zygote的分裂
在Zygote的诞生一文中init进程是如何一步步创建Zygote进程的,也了解了Zygote的进程的作用.Zygote进程的诞生对于整个Java世界可以说有着"开天辟地"的作用, ...
- DataTable详解,以及dataview
原文地址:http://www.cnblogs.com/moss_tan_jun/archive/2010/09/20/1832131.html 得到DataTable 得到DataTable有许多方 ...
- Moom for mac 最棒的窗口管理软件
win7下,鼠标拖动窗口向左.右,两个窗口就在一个桌面上平分秋色了 mac下只能使用三只爪向上的手势查看当前桌面运行的程序,或者三只爪左右滑动查看全屏显示的其他程序,有时候一边看书一边敲代码很不方便 ...
- PAT 1029. 旧键盘(20)
旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现.现在给出应该输入的一段文字.以及实际被输入的文字,请你列出肯定坏掉的那些键. 输入格式: 输入在2行中分别给出应该输入的文字.以及实际 ...
- P3376 【模板】网络最大流
P3376 [模板]网络最大流 题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点 ...