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]](n>=3)。求前n项和,n<=1e18。
分析
一看就是得打表找规律或推公式的题目。
先把a[i]打出来: 1 1 2 2 3 4 4 4 5 6 6...
乍眼一看每个数字出现的次数有点意思,于是打出每个数出现次数:
数值 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
次数 2 2 1 3 1 2 1 4 1 2 1 3 1 2 1 5
感觉第一个1很不和谐啊,先忽略这个1看看:
数值 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
次数 1 2 1 3 1 2 1 4 1 2 1 3 1 2 1 5
可以看到前2^i个数的出现次数是由前2^(i-1)个数复制两次,并把2^i的次数+1得到的。
这样就得到数值出现次数的规律了,设cnt[i]为前2^i个数的次数之和,那么cnt[i]=2*cnt[i-1]+1。
有了cnt[i],对于一个下标n,可以求出a[n]的值,相反也可以求出值为a[n]的第一个位置。
然后怎么求前n项和呢?把相同出现次数的值输出看看:
1-- 1,3,5,7,9....
2-- 2,6,10,14...
3-- 4,12,20,28...
4-- 8,24,40,56...
....
很明显的规律,对于次数k,对应数值形成一个首项为2^(k-1),公差为2^k的等差数列。这个等差数列的每个值都出现k次。
所以,可以枚举次数,计算以a[n]为上界的项数,再把这个等差数列的和*次数加到答案中。
需要注意,计算等差数列时不能把a[n]算进去,因为a[n]出现的次数在n的限制下是不完全的,需要另外计算,这时就用到上面计算的a[n]出现的第一个位置了,由此算出a[n]实际出现的次数,再加到答案中。
由于数据是ll级别,出现相乘时不要忘记先模一下。
其它细节看代码。
#include<bits/stdc++.h> using namespace std; typedef long long ll;
const ll mod = 1e9 + ; ll cnt[],p[];
//预处理2^i和cnt[i]
void init(){
cnt[]=p[]=;
for(int i=;i<=;i++) cnt[i]=*cnt[i-]+,p[i]=*p[i-];
}
//计算a[n]的数值
ll caln(ll n){
if(n==) return ;//特殊处理
n--;//由于规律从实际的第二个开始计算
ll an = ;
for(int i=;i>=;i--){
while(cnt[i]<=n){
n-=cnt[i];
an+=p[i];
}
}
return an;
}
//根据a[n]计算最早出现的位置
ll gps(ll an){
if(an==) return ;
an--; //同上
ll pos=;
for(int i=;i>=;i--){
while(p[i]<=an){
an-=p[i];
pos+=cnt[i];
}
}
return pos+;
}
int main() {
#ifdef LOCAL
freopen("in.txt","r",stdin);
#endif // LOCAL
int T;
ll n;
scanf("%d",&T);
init();
ll _inv = ;//2的逆元
while(T--){
scanf("%lld",&n);
ll an = caln(n);
ll cnt = n - gps(an);//a[n]出现的实际次数
ll ans = ;
for(int i=;p[i-]<=an;i++){//枚举次数,终结条件为某个等差数列的首项大于a[n]
ll x1 = p[i-]; //首项
ll d = p[i]; //公差
//项数。注意,正常的项数应该是((an-x1)/d+1),但这里不能保证a[n]全部出现了,
//所以当((an-x1)%d==0)时说明a[n]位于当前的等差数列中,需要根据实际个数来计算,于是不+1
ll num = ((an-x1)%d==)?((an-x1)/d):((an-x1)/d+);
ll xn = x1 + (num-)*d; //尾项
ll sum = (x1%mod+xn%mod)%mod*(num%mod)%mod*_inv%mod; //等差数列前num项和
ans = (ans+i*sum%mod)%mod; //加入答案,共出现i次
if((an-x1)%d==)
ans=(ans+cnt*(an%mod)%mod)%mod; //a[n]位于此数列,特别计算一下。
}
printf("%lld\n",ans+);//由于计算中忽略了第一项1,最后加上
}
return ;
}
HDU - 6304(2018 Multi-University Training Contest 1) Chiaki Sequence Revisited(数学+思维)的更多相关文章
- 2018 杭电多校1 - Chiaki Sequence Revisited
题目链接 Problem Description Chiaki is interested in an infinite sequence $$$a_1,a_2,a_3,...,$$$ which i ...
- hdu 4915 Parenthese sequence--2014 Multi-University Training Contest 5
主题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4915 Parenthese sequence Time Limit: 2000/1000 MS (Ja ...
- hdu 4902 Nice boat--2014 Multi-University Training Contest 4
题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=4902 Nice boat Time Limit: 30000/15000 MS (Java/Othe ...
- hdu 4925 Apple Tree--2014 Multi-University Training Contest 6
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4925 Apple Tree Time Limit: 2000/1000 MS (Java/Others ...
- HDU校赛 | 2019 Multi-University Training Contest 6
2019 Multi-University Training Contest 6 http://acm.hdu.edu.cn/contests/contest_show.php?cid=853 100 ...
- HDU校赛 | 2019 Multi-University Training Contest 5
2019 Multi-University Training Contest 5 http://acm.hdu.edu.cn/contests/contest_show.php?cid=852 100 ...
- HDU校赛 | 2019 Multi-University Training Contest 4
2019 Multi-University Training Contest 4 http://acm.hdu.edu.cn/contests/contest_show.php?cid=851 100 ...
- HDU校赛 | 2019 Multi-University Training Contest 3
2019 Multi-University Training Contest 3 http://acm.hdu.edu.cn/contests/contest_show.php?cid=850 100 ...
- HDU校赛 | 2019 Multi-University Training Contest 2
2019 Multi-University Training Contest 2 http://acm.hdu.edu.cn/contests/contest_show.php?cid=849 100 ...
随机推荐
- 局域网共享hfs 软件使用
前言 由于想从局域网同学电脑上偷点小片,又不想用u盘拷贝.所有在同学电脑上打开hfs软件,通过自己电脑ie浏览器(chrome不行报错)下载即可. 流程 1.两台电脑在同一局域网下,在同学电脑上打开h ...
- java使用Rome解析Rss的实例(转)
Rome简介 Rome是为RSS聚合而开发的开源包,它可以支持0.91.0.92.0.93.0.94.1.0.2.0,可以说rss的版本基本上都支持了. Rss简介 RSS是站点用来和其他站点之间共享 ...
- 自学华为IoT物联网_05 能源工业物联网常见问题及解决方案
点击返回自学华为IoT物流网 自学华为IoT物联网_05 能源工业物联网常见问题及解决方案 1. 1 能源工业--油田业务面临的三大挑战 故障处理不及时: 部分油田开采难道大.机械故障较多.现场发生的 ...
- 构建DHCP服务
--------------------DHCP 配置-------------------# yum install dhcp -y# vim /etc/dhcp/dhcpd.conf# cp /u ...
- HDU6280 From Tree to Graph
下午打了湘潭邀请赛,好像缓解了一下北京网络赛超强的自闭感.补一下这个图论题.(补了很久) 题意:给你一颗n节点的树,有m个操作,每次向xi和lca(xi,yi)连边,然后每次zi就是对于新的图在删除每 ...
- thinkphp5中__PUBLIC__的使用
在使用thinkphp5.1开发的时候遇到设置__PUBLIC__无法生效的问题.这次的版本升级有比较大的改动,很多写法已经被更改,下面说下怎么去解决这个问题. 工具/原料 phpstorm ln ...
- 模拟@Test的功能实现
注解和注释区别 * 注释:给程序员看的.* 注解:给虚拟机看的.(让虚拟机看到程序中的注解,注解代表程序的一些特殊的功能.) JDK中提供的注解 @Override :描述子类重写父类的方法: * J ...
- Up-to-date cache with EclipseLink and Oracle
Up-to-date cache with EclipseLink and Oracle One of the most useful feature provided by ORM librarie ...
- P3373 线段树模板
好,这是一个线段树模板. #include <cstdio> using namespace std; ; long long int sum[N],tag1[N],tag2[N],mo; ...
- A1098. Insertion or Heap Sort
According to Wikipedia: Insertion sort iterates, consuming one input element each repetition, and gr ...