1. 程式人生 > >【規律】Hzy's Rabbit Play

【規律】Hzy's Rabbit Play

題目描述

Hzy在和她的n只兔兔玩。
兔兔們站成一行,每次,Hzy可以選擇一個區間[l,r],然後抱抱區間裡的所有兔兔,並獲得等同於區間長度r−l+1的愉悅度。每個區間Hzy只能選擇一次,請問Hzy一共能獲得多少愉悅度?
因為這個數太大了,所以Hzy只需要你輸出這個數對109+7取模後的結果。

輸入

一行一個正整數n,表示Hzy的兔兔的數量(n≤1018)。

輸出

一行一個正整數,表示Hzy獲得的總愉悅度對109+7取模後的結果。

樣例輸入

4

樣例輸出

20

【小結】:

一開始自己開始做,一直以為這是一道規律題,後來發現,是推公式的。

首先你寫出前5組事例,就是n=[1,5],然後發現這是一個組合數

他的規律就是:C(n+2,n-1)

我以為可以套用Lucas來寫的,後來發現自己還是年輕了點,因為時間過不去。

超時程式碼:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll mod = 1e9+7;
ll qmul ( ll a, ll b ){
    ll ans=0;
    while(b){
        if(b&1){
            ans=(ans+a)%mod;
        }
        a=(a+a)%mod;
        b>>=1;
    }
    return ans;
}
ll qpow ( ll a, ll b ){
    ll ans=1;
    a=a%mod;
    while(b){
        if(b&1){
            ans=qmul(ans,a);
        }
        a=qmul(a,a);
        b>>=1;
    }
    return ans%mod;
}
ll C(ll n,ll m){
    if(m>n) return 0;
    ll ans=1;
    for (ll i=1;i<=m;i++){
        ll a=(n+i-m)%mod;
        ll b=i%mod;
        ans=ans*(a*qpow(b,mod-2)%mod)%mod;
    }
    return ans;
}
ll Lucas (ll n,ll m){
    if ( m==0 ) return 1;
        return C(n%mod,m%mod)*Lucas(n/mod,m/mod)%mod;
 
}
/*ll solve(ll n){
    ll ans=0;
    ans=qmul(qpow(n,2),(n+1))*qpow(2,mod-2)%mod;
    ans=(ans-qmul(n,(n+1))*qpow(2,mod-2)%mod+mod)%mod;
    ans=(ans-qmul(qmul(n,(n+1)),(2*n+1))*qpow(6,mod-2)%mod+mod)%mod;
    return ans;
}*/
int main()
{
    ll n;
    scanf("%lld",&n);
    printf("%lld\n",Lucas(n+2,n-1));
    return 0;
}

後來發現,這個原來要推公式來做的,

公式就是。

以n=5為例子:

然後大家看:

ans=5*1+4*2+3*3+2*4+1*5

推廣到n。

ans=n*(1) + (n-1) * 2 +(n-2) *3+ ……+(1)*n

ans=n*(1) + (n-1) * 2 +(n-2) *3+ ……+(n-(n-1))*n

ans=(1+2+……+n)*n-1*2-2*3-……-(n-1)*n

分成兩部分,

前半部分直接套用等差數列前n項求和公式即可,後半部分,我都不會推導,然後我找到的百度幫忙。

求:1*2+2*3+3*4+……+(n-1)*n

應該是1*2+2*3+3*4+...+n(n+1) 吧
一。n(n+1)=n^2+n
原式=(1^2+1)+(2^2+2)+(3^2+3)...+(n^2+n)
=(1^2+2^2+3^2+4^2+5^2...+n^2)+(1+2+3+...+n)
分組求和,根據公式1^2+2^2+3^2+4^2+5^2...+n^2=n(n+1)(2n+1)/6以及 1+2+3+...+n=n*(n+1)/2
所以原式=n(n+1)(2n+1)/6 + n*(n+1)/2 =(n+2)(n+1)n/3
二。裂項求和。
n(n+1)=[(n+2)(n+1)n-(n+1)n(n-1)]/3
也就是 1*2=(3*2*1-2*1*0)/3,
2*3=(4*3*2-3*2*1)/3.....
所以原式=(3*2*1-2*1*0)/3 + (4*3*2-3*2*1)/3 +(5*4*3-4*3*2)/3 +...+[(n+2)(n+1)n-(n+1)n(n-1)]/3
中間項都可以消去
=(n+2)(n+1)n/3

 求出來了,然後代入求解就可以了。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll mod = 1e9+7;
ll qmul ( ll a, ll b ){
    ll ans=0;
    while(b){
        if(b&1){
            ans=(ans+a)%mod;
        }
        a=(a+a)%mod;
        b>>=1;
    }
    return ans;
}
ll qpow ( ll a, ll b ){
    ll ans=1;
    a=a%mod;
    while(b){
        if(b&1){
            ans=qmul(ans,a);
        }
        a=qmul(a,a);
        b>>=1;
    }
    return ans%mod;
}
ll C(ll n,ll m){
    if(m>n) return 0;
    ll ans=1;
    for (ll i=1;i<=m;i++){
        ll a=(n+i-m)%mod;
        ll b=i%mod;
        ans=ans*(a*qpow(b,mod-2)%mod)%mod;
    }
    return ans;
}
ll Lucas (ll n,ll m){
    if ( m==0 ) return 1;
    return C(n%mod,m%mod)*Lucas(n/mod,m/mod)%mod;
 
}
ll solve(ll n){
    ll ans=0;
    ans=qpow(n,3);
    ans=(ans+3*qpow(n,2)%mod)%mod;
    ans=(ans+2*n%mod)%mod;
    ans=ans*qpow(6,mod-2)%mod;
    return ans;
}
int main()
{
    ll n;
 
    scanf("%lld",&n);
    printf("%lld\n",solve(n));
 
    return 0;
}

相關推薦

規律Hzy's Rabbit Play

題目描述 Hzy在和她的n只兔兔玩。 兔兔們站成一行,每次,Hzy可以選擇一個區間[l,r],然後抱抱區間裡的所有兔兔,並獲得等同於區間長度r−l+1的愉悅度。每個區間Hzy只能選擇一次,請問Hzy一共能獲得多少愉悅度? 因為這個數太大了,所以Hzy只需要你輸出這個數對10

思維Hzy's Rabbit Stick

題目描述 給兔兔們染完顏色後,Hzy把n只顏色不同的兔兔放在了一根長度為L=10n的木棍的不同位置(每隻兔兔的位置在[0,L]之間)上,讓她們做做運動。 在最開始的時候,Hzy會給每隻兔兔指定一個方向,所有的兔兔都會乖乖地按照Hzy給她們指定的方向走(速度為每秒一個單位長度

排序規律Codeforces Round #254 (Div. 2) - D. Rooter's Song

names nes rac then represent cin loaded output same D. DZY Loves FFT Source http://codeforces.com/contest/445/problem/D Description Wh

BZOJ3470Freda’s Walk 概率與期望

space 現在 pre -c 我們 mil pop 小數 ble 【BZOJ3470】Freda’s Walk Description 雨後的Poetic Island空氣格外清新,於是Freda和Rainbow出來散步。 Poetic Island的

BZOJ4129Haruna’s Breakfast(樹上莫隊)

mex 端點 ble Go != gis odi down 分塊 【BZOJ4129】Haruna’s Breakfast(樹上莫隊) 題面 BZOJ Description Haruna每天都會給提督做早餐! 這天她發現早飯的食材被調皮的 Shimakaze放到了一棵 樹

轉載python %s %d %f

number %d html out 綜合 bar cli OS 結果 %s 字符串 [python] view plain copy print? string="hello" #%s打印時結果是hello print "stri

JZOJ5793S練跑步BFS

題目大意: 題目連結:https://jzoj.net/senior/#main/show/5793 題目圖片: http://wx1.sinaimg.cn/mw690/0060lm7Tly1fvx7ksrc55j30j20dw3z4.jpg http://wx3.sinaimg.c

NGUIui tween 和 play tween

這個功能很強大,剛剛接觸所以不是瞭解很深,我認為就是一個動作預製體。 把要執行動作的物件加上tween,記得要去掉選中這個的鉤。然後設定動作。 接下來,把觸發物件,例如按鈕啊加上Play tween。如果執行動作物件是個組,記得勾上Tween Group. 把執行動作的物件(夫節點)拉到

哈爾濱理工大學軟體與微電子學院第八屆程式設計競賽同步賽(高年級) A 小樂樂的組合數+ 規律

任意門:https://ac.nowcoder.com/acm/contest/301/A 題意概括: 連結:https://ac.nowcoder.com/acm/contest/301/A來源:牛客網 小樂樂得知一週有7天之後就對7產生了興趣。 小樂樂得到了兩堆數字數字時連續的。

瀋陽網路賽K-Supreme Number規律

 26.89%  1000ms  131072K A prime number (or a prime) is a natural number greater than 11 that cannot be formed by multiplying two smalle

CF C. Sequence Transformation規律

題意:給你一個n  然後代表1到n的一個序列 然後說每次進行一種操作  序列當前所有數的gcd   然後把gcd結果加入一個答案陣列   然後此時可以刪除序列中的一個數 重複這種操作 直至序列沒有數  同時保證答案序列是字典序最大  前面的數越大越好 收穫:樣例

CF605CFreelancer's Dreams-凸包

測試地址:Freelancer’s Dreams 題目大意: 有nnn項工作,每項工作有兩項屬性ai,bia_i,b_iai​,bi​,表示做111單位時間可以獲得aia_iai​的經驗和bib_ibi​的錢,現在要攢夠ppp的經驗和qqq的錢,且任意一個時刻只

C++%c,%s分別代表什麼意思

1.  這是C語言的格式輸出,%c,%s這些代表你要輸出的資料的資料型別:%d 十進位制有符號整數 。 這兩個符號分別用在輸入或者輸出函式中。比如:char c='A'; printf("%C\n",c);則此時控制檯會輸出字元A。 再看如下表達式: char s[25]=

Codeforces Round 323 (Div 2)B貪心Robot's Task 最少轉彎次數拿走所有物品

Note In the first sample you can assemble all the pieces of information in the optimal manner by assembling first the piece of information in the first c

併發Amdahl's Law 阿姆達爾定律

轉自:http://book.2cto.com/201301/12892.html 利用Amdahl定律,可以計算出通過改進計算機某一部分而能獲得的效能增益。Amdahl定律表明,使用某種快速執行模式獲得的效能改進受限於可使用此種快速執行方式的時間比例。 Amdah

藍橋杯 數字遊戲規律

題目連結 題目意思 解題思路 我們看一下這個樣例的資料1、2、4、7、 11、 3、 9、 3、 11、 7、 4、 2、 1、 1、 2、 4。。。三個人那麼每隔兩個數就是棟棟說的數,那就是1、 7、 9、 7、 1、 4。。。我們可以看出它

POJ2528Mayor's Posters-線段樹+離散化

(本人本題完成於2016-7-23) 題目大意:有一面很長(10000000節)的牆,要在上面貼N張海報,對於第i張海報,它將會覆蓋牆面的第Li~Ri節。剛開始牆面是空的,求最後還有多少張海報是可見的

2018年東北農業大學春季校賽 B wyh的矩陣規律

題目連結 思路 先加入 中間的那行 和中間的那列 再減去 最中間那個數 因為它 加了兩次 然後逐行往下加 會發現是一個三角形 然後下面是一個對稱的三角形 注意一下 不要反覆加 就可以了

POJ2411Mondriaan's Dream-狀態壓縮DP(插頭DP?)

題目大意:求用1*2的骨牌完美覆蓋h*w的棋盤的方法數。 做法:這道題絕對是經典題啊,久仰大名......關於輪廓線和插頭的思想可以看cdq大大的論文:點這裡。但這題不用搞那麼麻煩,因為骨牌之間相互

規律貪心數學HDU 5573 Binary Tree

題目連結: 題目大意:   從1走到第k層,下一層的數是上一層的數*2或者*2+1,可以選擇加上或者減去走的數,最終要求結果為n   輸出每層走的數,和是加還是減 題目思路:   【規律】【貪心】【數學】   首先苦思冥想一下,發現,1 2 4 8...2k可以湊成任意的