又到了神奇的模擬賽時間~
真是喪~
好吧我們來看看題目
小紅帽是pop star上最著名的人類畫家,她可以將任何畫出的東西變成真實的物品。賦予她這樣神奇能力的正是她手上的畫筆。
小紅帽每次作畫時,都需要用到她的調色盤,我們把每個自然數都對應一種顏色,那麼小紅帽的調色盤就可以看成是乙個斐波那契數列(數列第1、2項都為1),小紅帽每次需要一種顏色時,她都會用畫筆蘸取一段區間,得到的顏色就是區間裡所有的數之和。
受到秋之國人民的邀請,小紅帽要為他們畫乙個夏天。小紅帽要進行n次取色,給出每次蘸取的區間[l,r],作為小c委派來進行記錄的你需要輸出每次小紅帽得到的顏色,答案對mod取模。
【資料範圍】
對於10%的資料,n<=100,l,r<=10^4;
對於30%的資料,l,r<=10^7;
對於90%的資料,mod<=10^9;
對於100%的資料,0<=n<=1000,1<=l<=r<=10^18,0————————————————我是分割線————————————————————
很顯然,這道題目就是求斐波那契數列前r項的字首和減去前l-1項的字首和,普通的dp都可以做到求斐波那契數列,但是很顯然10^18我們就會t
在此我們講講矩陣乘法
矩陣乘法,顧名思義,就是2個矩陣相乘。具體如下
所以呢我們如果要算斐波那契數列的第n項只需要將圖中的
矩陣自乘n-2次,再乘第乙個矩陣,得到的矩陣的第乙個數就是答案
那麼我們又怎樣求字首和呢?
在此有兩種方法供參考
top1:找規律
我們假設a,b為斐波那契數列的第一項和第二項
那麼我們很顯然就可以遞推出後面的幾項
那麼這有什麼規律呢?
很快就發現了規律
a=a+b-b;a+b=a+2b-b;2a+2b=2a+3b-b;3a+4b=3a+5b-b.....
所以我們只需要求num[r+2]-1-(num[l-1+r]-1)=num[r+2]-num[l-1]即可啦
top2:構造矩陣
顯然我們知道我們要保留答案矩陣的前面2個數,而我們想辦法構造出第三個數,用於計算字首和。這樣將這個矩陣自乘n-2次,輸出第三個數就好啦。
然後我們會想到我們的字首和就是sum[i]=sum[i-1]+num[i];
然後就會構造出這個矩陣啦
———————————————我是分割線—————————————————
那麼我們還看到乙個問題,如何處理mod?
我們知道如果mod為10^18
那麼一次乘法操作的數會達到10^36
如果是這樣我們就需要做高精除+高精乘了。
但是有沒有更快的方法?
首先我們知道如果在加法中進行取餘,結果不改變。
所以我們將乘法轉變為加法
這樣速度雖然慢了點,卻不會爆long long
然後這道題就愉快解決啦!
下面貼**
#include#include#include
using
namespace
std;
intn;
struct
matrix;
unsigned
long
long
l,r,mod;
long
long mul(long
long x,long
long
y)matrix multiply(matrix a,matrix b)
c.mat[i][j]=sum;
}return
c;
} matrix matmod(matrix a,unsigned
long
long
k)
return
res;
}unsigned
long
long work(unsigned long
longx)
intmain()
return0;
fclose(stdin);
fclose(stdout);
}
2015 10 31的NOIP模擬賽
這是noip前的最後一周了。第一題是個組合數學的問題,規模不算太大。但第一反應就直接dp了,o n 2 的複雜度,始終想不到優化。本來看著1 3 4 6 10 15一串串數覺得多熟悉的,就是想不起來那是組合數。最後只有80分 第二題算是基本想到了吧,但是忽略了乙個問題 我的想法是每行0的個數要麼是當...
NOIP模擬賽 盟主的憂慮
顯然任意所求路徑就只經過一條密道,然後呢,畫圖發現就是乙個個環,然後可以用並查集來維護屬於乙個環或者是直接賦值 includeusing namespace std long long read while ch 0 ch 9 return num struct ooedge 200005 stru...
noip模擬賽 czy的後宮
czy要妥善安排他的後宮,他想在機房擺一群妹子,一共有n個位置排成一排,每個位置可以擺妹子也可以不擺妹子。有些型別妹子如果擺在相鄰的位置 隔著乙個空的位置不算相鄰 就不好看了。假定每種妹子數量無限,求擺妹子的方案數。輸入格式 輸出格式 輸出只有乙個整數,為方案數 這個數字可能很大,請輸出方案數除以1...