digital root = n==0 ? 0 : n%9==0 ? 9:n%9;
可以简单证明一下
n = a0*n^0 + a1*n^1 + ... + ak * n^k
n%9 = a0+a1+..+ak
然后,数学归纳易知结论是正确的。
因此9个状态就够了,表示%9的结果。
这里需要特殊处理0, 表示状态为0。

 /* 4351 */
#include <iostream>
#include <sstream>
#include <string>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <vector>
#include <deque>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <ctime>
#include <cstring>
#include <climits>
#include <cctype>
#include <cassert>
#include <functional>
#include <iterator>
#include <iomanip>
using namespace std;
//#pragma comment(linker,"/STACK:102400000,1024000") #define sti set<int>
#define stpii set<pair<int, int> >
#define mpii map<int,int>
#define vi vector<int>
#define pii pair<int,int>
#define vpii vector<pair<int,int> >
#define rep(i, a, n) for (int i=a;i<n;++i)
#define per(i, a, n) for (int i=n-1;i>=a;--i)
#define clr clear
#define pb push_back
#define mp make_pair
#define fir first
#define sec second
#define all(x) (x).begin(),(x).end()
#define SZ(x) ((int)(x).size())
#define lson l, mid, rt<<1
#define rson mid+1, r, rt<<1|1 typedef struct {
short sum;
short lst, rst, st;
} node_t; const int maxn = 1e5+;
int zn[maxn];
bool visit[];
int a[maxn];
node_t nd[maxn<<];
int Mod9[];
short sum_st[][];
short st_st[][];
int n; void init() {
rep(i, , )
Mod9[i] = i % ; rep(st, , ) {
rep(i, , ) {
int nst = ; rep(j, , ) {
if (st & (<<j)) {
int k = Mod9[i + j];
nst |= (<<k);
}
}
sum_st[i][st] = nst;
}
} rep(lst, , ) {
rep(rst, lst, ) {
int nst = ;
rep(i, , ) {
if ((lst & (<<i)) == )
continue;
rep(j, , ) {
if (rst & (<<j)) {
int k = Mod9[i+j];
nst |= (<<k);
}
}
}
st_st[lst][rst] = st_st[rst][lst] = nst;
}
}
} void PushUp(int rt) {
int lb = rt << ;
int rb = lb | ; nd[rt].sum = Mod9[nd[lb].sum + nd[rb].sum];
nd[rt].lst = nd[lb].lst | sum_st[nd[lb].sum][nd[rb].lst];
nd[rt].rst = nd[rb].rst | sum_st[nd[rb].sum][nd[lb].rst];
nd[rt].st = nd[lb].st | nd[rb].st | st_st[nd[lb].rst][nd[rb].lst];
} void Build(int l, int r, int rt) {
if (l == r) {
if (zn[l] == zn[l-]) {
nd[rt].sum = a[l];
nd[rt].lst = nd[rt].rst = nd[rt].st = ( << a[l]);
} else {
nd[rt].sum = a[l];
nd[rt].lst = nd[rt].rst = nd[rt].st = ;
}
return ;
} int mid = (l + r) >> ; Build(lson);
Build(rson); PushUp(rt);
} node_t Query(int L, int R, int l, int r, int rt) {
if (L==l && R==r) {
return nd[rt];
} int mid = (l + r) >> ; if (R <= mid) {
return Query(L, R, lson);
} else if (L > mid) {
return Query(L, R, rson);
} else {
node_t lnd = Query(L, mid, lson);
node_t rnd = Query(mid+, R, rson);
node_t ret; ret.sum = Mod9[lnd.sum + rnd.sum];
ret.lst = lnd.lst | sum_st[lnd.sum][rnd.lst];
ret.rst = rnd.rst | sum_st[rnd.sum][lnd.rst];
ret.st = lnd.st | rnd.st | st_st[lnd.rst][rnd.lst]; return ret;
}
} void solve() {
Build(, n, ); int q;
node_t d;
int l, r; scanf("%d", &q);
while (q--) {
scanf("%d %d", &l, &r);
memset(visit, false, sizeof(visit));
d = Query(l, r, , n, );
rep(i, , ) {
if (d.st & (<<i))
visit[i] = true;
}
visit[] = visit[];
visit[] = (zn[r] - zn[l-]) > ;
int cnt = ;
per(i, , ) {
if (visit[i]) {
if (cnt == )
printf("%d", i);
else
printf(" %d", i);
if (--cnt == )
break;
}
} while (cnt) {
printf(" -1");
--cnt;
}
putchar('\n');
}
} int main() {
ios::sync_with_stdio(false);
#ifndef ONLINE_JUDGE
freopen("data.in", "r", stdin);
freopen("data.out", "w", stdout);
#endif int t; init();
scanf("%d", &t);
rep(tt, , t+) {
scanf("%d", &n);
rep(i, , n+) {
scanf("%d", &a[i]);
zn[i] = zn[i-] + (a[i] == );
a[i] %= ;
}
printf("Case #%d:\n", tt);
solve();
if (tt != t)
putchar('\n');
} #ifndef ONLINE_JUDGE
printf("time = %d.\n", (int)clock());
#endif return ;
}

数据发生器。

 from copy import deepcopy
from random import randint, shuffle
import shutil
import string def GenDataIn():
with open("data.in", "w") as fout:
t = 10
bound = 10**9
fout.write("%d\n" % (t))
for tt in xrange(t):
n = randint(10, 20)
fout.write("%d\n" % (n))
L = []
for i in xrange(1, n):
x = randint(0, bound)
L.append(x)
L.append(0)
shuffle(L)
fout.write(" ".join(map(str, L)) + "\n")
q = (n+1)*n/2
fout.write("%d\n" % (q))
for l in xrange(1, n+1):
for r in xrange(l, n+1):
fout.write("%d %d\n" % (l, r)) def MovDataIn():
desFileName = "F:\eclipse_prj\workspace\hdoj\data.in"
shutil.copyfile("data.in", desFileName) if __name__ == "__main__":
GenDataIn()
MovDataIn()

【HDOJ】4351 Digital root的更多相关文章

  1. 【LeetCode】129. Sum Root to Leaf Numbers 解题报告(Python)

    [LeetCode]129. Sum Root to Leaf Numbers 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https://leetcode.com/pr ...

  2. 【Android】不弹root请求框检测手机是否root

    由于项目需要root安装软件,并且希望在合适的时候引导用户去开启root安装,故需要检测手机是否root. 最基本的判断如下,直接运行一个底层命令.(参考https://github.com/Trin ...

  3. 【HDOJ】4729 An Easy Problem for Elfness

    其实是求树上的路径间的数据第K大的题目.果断主席树 + LCA.初始流量是这条路径上的最小值.若a<=b,显然直接为s->t建立pipe可以使流量最优:否则,对[0, 10**4]二分得到 ...

  4. 【MySQL】MySQL忘记root密码解决方案

    转眼间从实习到现在已经快两年了.两年的工作做遇到过很多很多的拦路虎,大部分也通过搜索引擎找到了解决的方案.奈何大脑不是硬盘,偶尔有的问题第二次遇到还是有点抓蒙...所以决定把这些东西记录在博客上.这样 ...

  5. 【转】mysql忘记root密码的解决方法

    本文收集于本人的笔记本,由于找不到原文出处.在此省略,如哪位知道可以联系我加上. 方法一:在windows下:1.打开命令行(DOS)窗口,停止mysql服务: net stop mysql 2.在D ...

  6. 【HDOJ】【3506】Monkey Party

    DP/四边形不等式 裸题环形石子合并…… 拆环为链即可 //HDOJ 3506 #include<cmath> #include<vector> #include<cst ...

  7. 【HDOJ】【3516】Tree Construction

    DP/四边形不等式 这题跟石子合并有点像…… dp[i][j]为将第 i 个点开始的 j 个点合并的最小代价. 易知有 dp[i][j]=min{dp[i][j] , dp[i][k-i+1]+dp[ ...

  8. 【HDOJ】【3480】Division

    DP/四边形不等式 要求将一个可重集S分成M个子集,求子集的极差的平方和最小是多少…… 首先我们先将这N个数排序,容易想到每个自己都对应着这个有序数组中的一段……而不会是互相穿插着= =因为交换一下明 ...

  9. 【HDOJ】【2829】Lawrence

    DP/四边形不等式 做过POJ 1739 邮局那道题后就很容易写出动规方程: dp[i][j]=min{dp[i-1][k]+w[k+1][j]}(表示前 j 个点分成 i 块的最小代价) $w(l, ...

随机推荐

  1. 把div固定在网页顶部

    很多网站都有把某一块固定在顶部的功能,今天上网搜搜然后自己又写了一遍,贴出来给大家看看,哪天用到的时候自己也可以随时看看 <!DOCTYPE html PUBLIC "-//W3C// ...

  2. Hibernate Cascade & Inverse

    Cascade - 修改实体表 Inverse - 修改中间表 http://www.cnblogs.com/amboyna/archive/2008/02/18/1072260.html 1.到底在 ...

  3. NodeJS + Socket.io搭建聊天服务器

    第一步:安装node git clone https://github.com/joyent/node.git cd node git checkout v0.10.33-release ./conf ...

  4. 6个好用的Web开发工具

    在过去的几年间,涌现出了很多Web开发工具,它们大多还是比较吸引人的,方便了我们的工作.我们可以学习一下这些新东西,短时间就可以拓宽思路(PHP100推荐:学习10分钟,改变你的程序员生涯).这些应用 ...

  5. 关于location

    ---恢复内容开始--- window.location跳转+替换+刷新 一.最外层top跳转页面,适合用于iframe框架集 top.window.location.href("${pag ...

  6. N皇后摆放问题

    Description 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上.  你的任务是,对于给定的N,求出有多少种 ...

  7. EXTJS 资料 Ext.Ajax.request 获取返回数据

    下面是一个登陆页面调用的EXTJS login function,通过 url: '/UI/HttpHandlerData/Login/Login.ashx',获取返回登陆账户和密码! Ext.onR ...

  8. EXTJS 3.0 资料 控件之 combo 用法

    EXTJS combo 控件: 1.先定义store //年款 var comboData_ReleasYear = [ ['], ['], ['], ['] ]; 2.定义combo控件 { lay ...

  9. Understanding Responsive Web Design: Cross-browser Compatibility

    http://www.sitepoint.com/understanding-responsive-web-design-cross-browser-compatibility/ In the las ...

  10. MS SQL Server时间常用函数

    SQLServer时间日期函数详解,SQLServer,时间日期, 1.      当前系统日期.时间 select getdate() 2. dateadd      在向指定日期加上一段时间的基础 ...