1. 程式人生 > >HDU 6304 Chiaki Sequence Revisited [找規律+二分]

HDU 6304 Chiaki Sequence Revisited [找規律+二分]

題意

定義a[n]的遞推式,求a[i]的前n項和。

題解

通過打表可以簡單的找出規律,從一開始每個數出現次數的是1,2,1,3,1,2,1,4……,其規律是前2^i項由前2^(i-1)的數,複製一遍,並將第2^i項的數+1。通過這個規律,我們可以先記錄前2^i個數的出現次數和,通過二分的思想求出a[n]。為了求出前n項和,我們還可以發現出現次數為i次的數的首相是2^(i-1),公差是2^i。那麼通過這個規律,我們只要枚舉出現的次數,然後計算數字和即可得到答案。

AC程式碼

#include<stdio.h>
#include<iostream>
using namespace std;
#define mod 1000000007
typedef long long ll; ll a[105],f[105]; int main() { ll T; scanf("%lld",&T); a[0]=f[0]=1; for(ll i=1;i<=62;i++)a[i]=a[i-1]*2+1,f[i]=f[i-1]*2; ll inv=(mod+1)/2; while(T--) { ll pos=0,n,m,ma=-1,ans=0; scanf("%lld",&n); m=n; for(ll i=62;i>=0
;i--) if(m-a[i]>=0) m-=a[i],pos=pos+(1ll<<i); pos+=(m>0); ll now=pos-1,num=0; for(ll i=1;f[i-1]<=now;i++) { ll s=f[i-1],step=(now-s)/f[i]+1,e=(step-1)*f[i]+s; ll haha=(s+e)%mod*(step%mod)%mod*inv%mod; ans=(ans+haha*i
%mod)%mod; num+=step*i; } ans=(ans+1+(n-num-1)%mod*(pos%mod)%mod)%mod; printf("%lld\n",ans); } }

相關推薦

HDU 6304 Chiaki Sequence Revisited [規律+二分]

題意 定義a[n]的遞推式,求a[i]的前n項和。 題解 通過打表可以簡單的找出規律,從一開始每個數出現次數的是1,2,1,3,1,2,1,4……,其規律是前2^i項由前2^(i-1)的數,複製一遍,並將第2^i項的數+1。通過這個規律,我們可以先記錄前2

2018 Multi-University Training Contest 1 hdu 6304 Chiaki Sequence Revisited規律?數學?)

題目連結:http://acm.hdu.edu.cn/showproblem.php?pid=6304 題意:看一眼就懂了   做法:找規律,每個數出現的次數k,滿足以2^k差為2^k+1的等差數列,然後就可以了,然後正解是差分,阿貝爾變換,本人不會   程式

[HDU-6304] Chiaki Sequence Revisited

an={1an−an−1+an−1−an−2n=1,2n≥3an={1n=1,2an−an−1+an−1−an−2n≥3 求 ∑i=1naimod1000000007∑i=1naimod1000000007 There are multiple te

6304 Chiaki Sequence Revisited[2018杭電多校聯賽第一場 G](規律+位運算+逆元)

【題意】 給定一個序列a,定義a[1]=a[2]=1,a[n]=a[n-a[n-1]]+a[n-1-a[n-2]](n>=3),求該序列的前n項和是多少,結果對 1e9+7 取模 【輸入格式】 第一行為資料組數T(T<1e5),下面T行每行

6304 Chiaki Sequence Revisited

題目連結 題意:給出了個計算a[i]的公式,然後讓你求a[1~n]的和。 分析:好的,我們簡單粗暴的先打個表,發現規律(個屁),每一個a[i]出現的次數是lowbit(a[i])長度次,比如16出現的次數是lowbit(16) = 10000,長度為

HDU 1005 Number Sequence規律,思維)

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 153140    Accepted Submissio

Chiaki Sequence Revisited HDU - 6304 lowbit規律

otto article ast ati spa span n-1 display number Problem Description Chiaki is interested in an infinite sequence a1,a2,a3,..., which is

HDU 6304 2018 HDU多校第一場 Chiaki Sequence Revisited二分+倍增規律

Chiaki Sequence Revisited Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1717  

2018年hdu多校1007 Chiaki Sequence Revisited(謎之Meta-Fibonacci,二分+求n!中a出現的次數)

  題目大意:求Meta-Fibonacci的字首和。   謎之求和,打表得到前幾項發現是,1 1 2 2 3 4 4 4 5 6 6 7 8 8 8 8 9.......明顯除了1之外,其他數字出現的次數跟它當中含有2的冪次有關,比如奇數中不含有2,所以只出現1次,而

2018 多校聯賽第一場1007:Chiaki Sequence RevisitedHDU 6304

題意:給出一個數列的遞推式,求前n項和。 (因為圖片載入不上,遞推式自己去HDU6304看吧) 思路:這個題的n非常大(預處理不現實,所以先找規律吧),並且查詢的組數T<=1e5,(T非常大)所以一定是一個log級別的查詢 我的思路跟題解可能不太一樣,我下面寫

杭電多校第一場 Chiaki Sequence Revisited規律

Chiaki Sequence Revisited Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1624  

hdu 6304 多校第一場 Chiaki Sequence Revisited

//#include <bits/stdc++.h> #include<stdio.h> #include<string.h> #include<string> #include<math.h> #in

6304Chiaki Sequence Revisited

@Chiaki Sequence [email protected] @題目描述[email protected] Chiaki is interested in an infinite sequence a1,a2,a3,

HDU 5793 A Boring Question (規律 : 快速冪+乘法逆元)

cnblogs and ott miss 逆元 找規律 -- for while A Boring Question Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Ot

2017多校第7場 HDU 6129 Just do it 規律

ble nbsp bool name def ons spa esp bre 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=6129 題意:求a序列後m次xor前綴和 解法: 手動對1位置對每個位置的貢獻打表發現 第一次 貢

hdu 6129 Just do it 規律

-- std div its 題解 turn 個數 using const 題意很好理解 問你一個數組 按照他的規則處理m次之後是什麽樣的 看到這道題我一開始也沒什麽思路 但是我列了五個數 把它們m≤4的都算出來之後發現 如果m把化成二進制的這一位是1

HDU 1041 Computer Transformation(規律加大數乘)

esp ios ctype nsf printf stream ont tac tran 主要還是找規律,然後大數相乘 #include<stdio.h> #include<string.h> #include<math.h> #inc

HDU 3788——ZOJ問題(規律

題目連結 從樣例中找到其規律 就是第一次出現z的之前字元的個數 ×第一次出現z和最後出現j之間的‘o’的個數(且不能為空)=最後出現j之後的字元個數Accepted;(同理zoj也適用) #include<iostream> #include<set> #incl

HDU 5601 N*M bulbs (規律)

#include<bits/stdc++.h> using namespace std; #define debug puts("YES"); #define rep(x,y,z) for(int (x)=(y);(x)<(z);(x)++) #def

HDU 1061暴力打表規律

Rightmost Digit Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/O