Problem Description
Chiaki is interested in an infinite sequence a1,a2,a3,..., which is defined as follows:

an={1an−an−1+an−1−an−2n=1,2n≥3  

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).

 
Input
There are multiple test cases. The first line of input contains an integer T (1≤T≤105), indicating the number of test cases. For each test case:
The first line contains an integer n (1≤n≤1018).
 
Output
For each test case, output an integer denoting the answer.
 
Sample Input
10
1
2
3
4
5
6
7
8
9
10
 
Sample Output
1
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

转载至  https://blog.csdn.net/V5ZSQ/article/details/82350536

 这位大佬写的真好,膜膜膜膜!!

Chiaki Sequence Revisited HDU - 6304 lowbit找规律法的更多相关文章

  1. 2018 杭电多校1 - Chiaki Sequence Revisited

    题目链接 Problem Description Chiaki is interested in an infinite sequence $$$a_1,a_2,a_3,...,$$$ which i ...

  2. HDU 6304 Chiaki Sequence Revisited

    题目链接 : http://acm.hdu.edu.cn/showproblem.php?pid=6304 多校contest1   Problem Description Chiaki is int ...

  3. 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 ...

  4. 【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 ...

  5. [HDU6304][数学] Chiaki Sequence Revisited-杭电多校2018第一场G

    [HDU6304][数学] Chiaki Sequence Revisited -杭电多校2018第一场G 题目描述 现在抛给你一个数列\(A\) \[ a_n=\begin{cases}1 & ...

  6. hdu 1005 Number Sequence(矩阵快速幂,找规律,模版更通用)

    题目 第一次做是看了大牛的找规律结果,如下: //显然我看了答案,循环节点是48,但是为什么是48,据说是高手打表出来的 #include<stdio.h> int main() { ], ...

  7. 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 ...

  8. hdu acm 2082 找单词

    找单词 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  9. Bestcoder13 1003.Find Sequence(hdu 5064) 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5064 题目意思:给出n个数:a1, a2, ..., an,然后需要从中找出一个最长的序列 b1, b ...

随机推荐

  1. kubeadm构建k8s之Prometheus-operated监控(0.18.1)

    介绍: 大家好,k8s的搭建有许多方式,也有许多快速部署的,为了简化部署的复杂度,官方也提供了开源的kubeadm快速部署,最新1.10.x版本已经可以实现部署集群, 如果你对k8s的原理已经非常了解 ...

  2. java-length 、length()、size()的区别

    public static void main(String[] args) { //length .length().size()的区别 //length属性 针对数组长度 String a[]={ ...

  3. 遗传算法框架GAFT优化小记

    前言 前段时间一直在用自己写的遗传算法框架测试算法在优化力场参数的效果,但是跑起来效率很慢,因为适应度函数需要调用多次力场程序计算能量,但是还是比我预想中的慢我也没有及时对程序进行profiling和 ...

  4. node.js常用方法

    1.获取真实地址 function getClientIp(req) { return req.headers['x-forwarded-for'] || req.connection.remoteA ...

  5. jquery选择器 直观实验

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. Minimum Sum of Array(map迭代器)

    You are given an array a consisting of n integers a1, ..., an. In one operation, you can choose 2 el ...

  7. c# 窗体与窗体外的文件互动(拖拽)

    大部分控件都有此事件drag相关. 以picturebox为例: pictureBox1.AllowDrop = true;//此属性需要全打出来,不会自动识别添加 private void pict ...

  8. 智能客服 对话实现--python aiml包

    利用了python的aiml包进行应答 什么是AIML? AIML是Richard Wallace开发的. 他开发了一个叫A.L.I.C.E(Artificial Linguistics Intern ...

  9. c++第三次作业

    GitHub地址 https://github.com/ronghuijun/3Elevators-scheduling 实现过程 一开始打算分成三个类来写的 因为想到电梯的功能不太一样 一个只能上1 ...

  10. 201621123037 《Java程序设计》第11周学习总结

    作业11-多线程 标签(空格分隔): Java 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集多线程 1. 源代码阅读:多线程程 ...