Chiaki Sequence Revisited HDU - 6304 lowbit找规律法
Chiaki would like to know the sum of the first n terms of the sequence, i.e. ∑i=1nai. As this number may be very large, Chiaki is only interested in its remainder modulo (109+7).
The first line contains an integer n (1≤n≤1018).
1
2
3
4
5
6
7
8
9
10
2
4
6
9
13
17
21
26
32
思路
先对aiai打表找一下规律会发现每个数字出现的个数有如下的关系
12345678⋮12131214⋮
1122314351627184⋮⋮
思考一下就会发现对于数字ii他出现的个数是ii转化为二进制后最后一位1在位置,也就是
log2(lowbit(i))+1log2(lowbit(i))+1,我们把这个函数记作f(i)=log2(lowbit(i))+1f(i)=log2(lowbit(i))+1
接下来我们要解决的问题是给你nn如何求出anan,我们记f(i)f(i)的前缀和为g(i)g(i),如果知道了n刚好大于下标为ii的前缀和就可以确定anan是哪一个数了,前缀和g(i)g(i)是一个递增的函数,所以我们可以用二分的方法求出ii的值,下面的问题是然后求得g(i)g(i)的表达式
关于f(i)f(i)有两性质
{f(2i+1)=1f(2i)=f(i)+1
{f(2i+1)=1f(2i)=f(i)+1
利用这两个性质我们可以对g(n)g(n)进行化简
g(2n)=∑i=12nf(i)
g(2n)=∑i=12nf(i)
=∑i=1nf(2i)+∑i=0n−1f(2i+1)
=∑i=1nf(2i)+∑i=0n−1f(2i+1)
=n+∑i=1n(f(i)+1)
=n+∑i=1n(f(i)+1)
=∑i=1nf(i)+2n
=∑i=1nf(i)+2n
=g(n)+2n
=g(n)+2n
即g(n)=g(n2)+ng(n)=g(n2)+n
也就是说我们如果知道下标ii我们就可以就可以通过递归求出前缀和,有了前缀和的求解方式我们就可以通过二分来找出数字nn所对应的anan的值了,也就是第anan项的前缀和
那么我们找到了anan又如何求出和SnSn呢,我们先观察函数g(an)g(an)的值
g(an)=11+22+31+43+51+62+71+84+91+102⋯⋯
12345678910⋯g(an)=1+2+1+3+1+2+1+4+1+2⋯
我们已经知道了最后一项也就是anan的值,那我们观察一下会发现一些等差数列
12436125102071428⋮91836⋯⋯⋯∗1∗2∗3
13579⋯∗126101418⋯∗2412202836⋯∗3⋮
也就是是每个数字出现的个数都符合一个等差数列的关系,设求出的anan的值为xx
那么每一个等差数列的项数就为x−2i−12i+1x−2i−12i+1,其中ii代表是哪一个数列,那么我们就可以求得数列的末项然后用等差数列求和公式就可以求出小于anan中出现的数的和了,然后每个序列又有一个出现次数,再乘上这个序列出现的次数就可以得到最后的答案了
注意的是二分答案的时候为了不TLE要在n2n2的附近查找,序列的规律是除第一项之后的数的规律,所以一开始n-1,最后的答案再加上这个1
Chiaki Sequence Revisited HDU - 6304 lowbit找规律法的更多相关文章
- 2018 杭电多校1 - Chiaki Sequence Revisited
题目链接 Problem Description Chiaki is interested in an infinite sequence $$$a_1,a_2,a_3,...,$$$ which i ...
- HDU 6304 Chiaki Sequence Revisited
题目链接 : http://acm.hdu.edu.cn/showproblem.php?pid=6304 多校contest1 Problem Description Chiaki is int ...
- HDU - 6304(2018 Multi-University Training Contest 1) Chiaki Sequence Revisited(数学+思维)
http://acm.hdu.edu.cn/showproblem.php?pid=6304 题意 给出一个数列的定义,a[1]=a[2]=1,a[n]=a[n-a[n-1]]+a[n-1-a[n-2 ...
- 【HDOJ6304】Chiaki Sequence Revisited(数学)
题意:给定一个序列a,定义a[1]=a[2]=1,a[n]=a[n-a[n-1]]+a[n-1-a[n-2]](n>=3),求该序列的前n项和是多少,结果对 1e9+7 取模 n<=1e1 ...
- [HDU6304][数学] Chiaki Sequence Revisited-杭电多校2018第一场G
[HDU6304][数学] Chiaki Sequence Revisited -杭电多校2018第一场G 题目描述 现在抛给你一个数列\(A\) \[ a_n=\begin{cases}1 & ...
- hdu 1005 Number Sequence(矩阵快速幂,找规律,模版更通用)
题目 第一次做是看了大牛的找规律结果,如下: //显然我看了答案,循环节点是48,但是为什么是48,据说是高手打表出来的 #include<stdio.h> int main() { ], ...
- B - Sequence II (HDU 5147)
Long long ago, there is a sequence A with length n. All numbers in this sequence is no smaller than ...
- hdu acm 2082 找单词
找单词 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- Bestcoder13 1003.Find Sequence(hdu 5064) 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5064 题目意思:给出n个数:a1, a2, ..., an,然后需要从中找出一个最长的序列 b1, b ...
随机推荐
- CsvHelper文档-6类型转换
CsvHelper文档-6类型转换 CsvHelper使用类型转换器来转换string到对象,或者对象到string: ITypeConverter 类型转换器的结构,必须实现: public int ...
- centos 7.2 安装apache,mysql,php5.6
安装Apache.PHP.Mysql.连接Mysql数据库的包: yum -y install httpd yum -y install php yum -y install php-fpm yum ...
- PHP autoload与spl_autoload自动加载机制的深入理解
PHP autoload与spl_autoload自动加载机制的深入理解 作者: 字体:[增加 减小] 类型:转载 时间:2013-06-05我要评论 本篇文章是对PHP中的autoload与spl_ ...
- 安装VS的过程
软件工程学习到第三周,我们需要下载一个新的软件,用来进行软件测试.刚开始知道的时候觉得没甚么,不就是下个软件吗!有什么大不了的,分分钟搞定的事.可是想象很美好,现实很骨感.这是一个巨大的工作量呀,不仅 ...
- 智能客服 利用python运行java代码
因为需要在linux中用python来进行分析,顾需要利用python来运行java中语音转文字和文字转语音代码 在python中运行java代码需要利用jpype
- 福大软工1816:Beta(7/7)
Beta 冲刺 (7/7) 队名:第三视角 组长博客链接 本次作业链接 团队部分 团队燃尽图 工作情况汇报 张扬(组长) 过去两天完成了哪些任务 文字/口头描述 组织会议 wxpy中多个功能的开发 整 ...
- 【IdentityServer4文档】- 使用客户端凭据保护 API
使用客户端凭据保护 API quickstart 介绍了使用 IdentityServer 保护 API 的最基本场景. 接下来的场景,我们将定义一个 API 和一个想要访问它的客户端. 客户端将在 ...
- [并查集] How Many Tables
题目描述 Today is Ignatius' birthday. He invites a lot of friends. Now it's dinner time. Ignatius wants ...
- Swift-switch使用注意点
1.swift后面的()可以省略 2.case后面的额break可以省略 3.如果想产生case穿透使用fallthrough 4.case后面可以判断多个条件","分割 5.sw ...
- 复利计算C转java版
import java.util.Scanner; public class Compound_int { public static void main(String[] args) { tip() ...