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次,而2=2^1,6=2^1*3......,出現了2次,4=2^2出現了3次。所以借隊友的腦洞想到了如果是1 1 2 2......x,其中x是最後一次出現,那麼這個序列對應有x!中含有2的個數+1+x項,然後我又推出瞭如果知道這個序列末尾是x,那麼對應的字首和為:
1+2+……+x+2*(1+2+……+x/2)+4*(1+2+……+x/4)+.......+2^k*(1+2+......x/2^k)。
其中k比x小的2的最高冪次。
若干個等差數列。
於是想到二分求x對應的項數,然後求和即可,但是比賽的時候2的逆元忘了打表,一直tle,賽後隊友發現了這個問題,一下就過了......很多大佬說卡二分,我們也證實了確實沒卡二分,就是自己太菜,這種細節都能忘了。
因為看dalao們該這個題改的挺痛苦的,我們就能優化的地方都優化了,輸入掛,位運算,結果發現是卡了常數,當了一回小丑……
ac程式碼:
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdio>
#define mo 1000000007
using namespace std;
typedef long long ll;
long long acm;
inline ll read()
{
register ll c = getchar(),fg = 1,sum = 0;
while ( c > '9' || c < '0' )
{
if( c == '-' ) fg = -1 ;
c = getchar() ;
}
while ( c <= '9' && c >= '0' )
{
sum = sum * 10 + c - '0' ;
c = getchar() ;
}
return fg * sum ;
}
int a [ 1010 ], sum [ 1010 ] ;
long long getnum ( long long n ) {
long long num = 0 ;
long long nn = n ;
while ( nn ) {
num += nn / 2 ;
nn >>= 1 ;
}
return num + n + 1 ;
}//n!中2出現的次數
long long qpow ( long long a , long long b )
{
long long ans = 1 ;
a = a % mo;
while ( b ){
if ( b & 1 ) ans = ans * a % mo ;
a = a * a % mo ;
b >>= 1 ;
}
return ans;
}
long long getb ( long long x )
{
x=x%mo;
return ( x + ( ( x * ( x - 1 ) ) %mo * acm ) + mo ) % mo;
}//等差數列求和
long long getans ( long long n ) {
long long ans = 0 ;
long long temp = 1 ;
long long fun = 2 ;
while ( n ) {
ans = ( ans + ( temp % mo ) * ( getb ( n ) % mo ) ) % mo;
n /= fun ;
temp <<= 1 ;
}
return ( ans + 1 + mo ) % mo;
}
long long solve ( long long n )
{
long long l = ( n / 2 ) - 49 , r = ( n / 2 ) + 49 ;
long long fun , mid , fuck , ans ;
while ( l <= r )
{
mid = ( l + r ) >> 1 ;
if ( getnum ( mid ) <= n )
{
if ( getnum( mid + 1 ) > n )
{
fun = mid ;
break ;
}
else
{
l = mid ;
}
}
else
{
r = mid ;
}
}
fuck = getnum ( fun ) ;
ans = ( getans ( fun ) + ( ( ( n - fuck ) % mo ) * ( ( fun + 1 ) % mo ) ) % mo + mo ) % mo ;
return ans ;
}
int main(){
long long n;
int t;
a [ 1 ] = 1 ;
a [ 2 ] = 1 ;
sum [ 1 ] = 1 ;
sum [ 2 ] = 2 ;
for(int i = 3 ; i <= 1000 ; i++ ) {
a [ i ] = ( a [ i - a [ i - 1 ] ] + a [ i - 1 - a [ i - 2 ] ] ) ;
sum [ i ] = ( sum [ i - 1 ] + a [ i ] ) ;
}
n =2 ;
acm = qpow ( n , mo - 2 ) ;
scanf ( "%d" , &t ) ;
while ( t-- ) {
n = read() ;
if (n <= 1000 ) {
printf ( "%d\n", sum [ n ] ) ;
}
else
{
printf ( "%lld\n" , solve ( n ) ) ;
}
}
}
相關推薦
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 Multi-University Training Contest 1007 Chiaki Sequence Revisited(數學+遞迴)
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
2018 多校聯賽第一場1007:Chiaki Sequence Revisited(HDU 6304)
題意:給出一個數列的遞推式,求前n項和。 (因為圖片載入不上,遞推式自己去HDU6304看吧) 思路:這個題的n非常大(預處理不現實,所以先找規律吧),並且查詢的組數T<=1e5,(T非常大)所以一定是一個log級別的查詢 我的思路跟題解可能不太一樣,我下面寫
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
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行每行
2018年全國多校算法寒假訓練營練習比賽(第一場)C 六子沖
pac -- color blog set push its amp return 思路: 模擬。 代碼: #include<bits/stdc++.h> using namespace std; #define ll long long #de
2018年全國多校算法寒假訓練營練習比賽(第一場)G 圓圈
push def namespace 中間 mes har color clu oid 思路: 分形。 記錄中間左邊點的坐標,然後推出另外3個點的坐標,遞歸到最簡單的情況。 代碼: #include<bits/stdc++.h> using nam
2018年全國多校算法寒假訓練營練習比賽(第一場)D N階漢諾塔變形
img 算法 cout ear www. sync 練習 style http https://www.nowcoder.com/acm/contest/67/D 思路: 先手動模擬一下過程,以下是模擬過程,按順序表示第幾步需要移動的盤標號 1 1 2 1 1 2
2018年全國多校算法寒假訓練營練習比賽(第二場)
組成 滿足 targe ring1 例如 爐石傳說 oooo 曲線 更多 A題: 鏈接:https://www.nowcoder.com/acm/contest/74/A來源:牛客網 小魚兒吐泡泡,嘟嘟嘟冒出來。小魚兒會吐出兩種泡泡:大泡泡"O",小泡泡"o"。 兩個相鄰
2018年全國多校算法寒假訓練營練習比賽(第二場)F - 德瑪西亞萬歲
code 訓練營 比賽 最優 weight -o com 英雄 tin 鏈接:https://www.nowcoder.com/acm/contest/74/F來源:牛客網 題目描述 德瑪西亞是一個實力雄厚、奉公守法的國家,有著功勛卓著的光榮軍史。
2018年全國多校算法寒假訓練營練習比賽(第二場)B - TaoTao要吃雞
esc spa scanf namespace scribe sin bold ans 最大 鏈接:https://www.nowcoder.com/acm/contest/74/B來源:牛客網 題目描述 Taotao的電腦帶不動絕地求生,所以tao
2018年全國多校算法寒假訓練營練習比賽(第二場)A.吐泡泡
兩種 mark 例如 mes names urn mar code else 原題鏈接 描述 小魚兒吐泡泡,嘟嘟嘟冒出來。小魚兒會吐出兩種泡泡:大泡泡"O",小泡泡"o"。 兩個相鄰的小泡泡會融成一個大泡泡,兩個相鄰的大泡泡會爆掉。 (是的你沒看錯,小氣泡和大氣泡不會產生任
2018年全國多校算法寒假訓練營練習比賽(第三場)題解
排序 esp 註意 test sca big %d question long long 【題目連接】 由於在比賽期間發現了很多是原題,所以直接抄了原題代碼,稍後準備重寫。 A - 不凡的夫夫 答案為$\left\lfloor {\sum\limits_
【2018年全國多校算法寒假訓練營練習比賽(第三場)】
upload 線段 fall 警鐘 預處理 數學 tex sqrt -- 之前題目比較水,今天的還可以。 【A 不凡的大夫】 方法一:答案是log8(n!),解決方案是預處理,將需要的答案記錄下來以免超內存; 方法二:用公式,斯特林公式: 【B 一個小問
2018年全國多校算法寒假訓練
ike pre 興趣 sca 一個數 include 不能 可能 相同 題目描述 夫夫有一天對一個數有多少位數感興趣,但是他又不想跟凡夫俗子一樣,所以他想知道給一個整數n,求n!的在8進制下的位數是多少位。 輸入描述: 第一行是一個整數t(0<t<=1000
斯特林公式-Stirling公式(取N階乘近似值)-HDU1018-Big Number 牛客網NowCoder 2018年全國多校算法寒假訓練營練習比賽(第三場)A.不凡的夫夫
subject color content coder -m ria 一點 練習 java 最近一堆題目要補,一直鹹魚,補了一堆水題都沒必要寫題解。備忘一下這個公式。 Stirling公式的意義在於:當n足夠大時,n!計算起來十分困難,雖然有很多關於n!的等式,但並不能很
2018年全國多校算法寒假訓練營練習比賽(第四場)題解
ret ref amp 排列 break call eof while push_back 【題目鏈接】 A - 石油采集 題意:有一個$01$矩陣,每次可以拿走兩個相鄰的$1$,問最多能操作幾次。 這題和HDU 1507一樣。二維矩陣四連通圖是一個二分圖
牛客網NowCoder 2018年全國多校算法寒假訓練營練習比賽(第四場)A.石油采集(dfs) B.道路建設(最小生成樹prim) C.求交集(暴力) F.Call to your teacher(迪傑斯特拉亂用) H.老子的全排列呢(dfs)
初始 -o 地圖 意義 技術 tle bject ios urn 菜哭了。。。 A.石油采集 時間限制:C/C++ 1秒,其他語言2秒 空間限制:C/C++ 32768K,其他語言65536K 64bit IO Format: %lld 鏈
【2018年全國多校算法寒假訓練營練習比賽(第四場)-A】石油采集(匈牙利算法)
sca scanf tor 代碼 contest bit span 比賽 targe 試題鏈接:https://www.nowcoder.com/acm/contest/76/A 【思路】 每個‘#’的右邊和下邊如果也是‘#&r
牛客網 2018年全國多校算法寒假訓練營練習比賽(第四場)
ios ext ++i onclick 比賽 dag 練習 empty 分享圖片 T1 石油采集 這題可以建一張二分圖跑最大匹配,也可以直接染色然後數數 #include<bits/stdc++.h> using namespace std;