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

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 ) ) ;
        }
    }
}
 

相關推薦

2018hdu1007 Chiaki Sequence RevisitedMeta-Fibonacci二分+na出現次數

  題目大意:求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 聯賽第一場1007Chiaki Sequence RevisitedHDU 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;