矩陣快速冪 集合

2021-07-09 21:01:32 字數 3472 閱讀 3636

問題描述

克拉克是一名人格**患者。某一天,克拉克變成了乙個研究人員,在研究數字。  

他想知道在所有長度在[l, r][l,r]之間的能被77整除且相鄰數字之和不為kk的正整數有多少個。[l, r][l,r]之間的能被77整除且相鄰數字之和不為kk的正整數有多少個。

輸入描述

第一行乙個整數t(1 \le t \le 5)t(1≤t≤5),表示資料的組數。  

每組資料只有一行三個整數l, r, k(1 \le l \le r \le 10^9, 0 \le k \le 18)l,r,k(1≤l≤r≤10​9​​,0≤k≤18)。t(1 \le t \le 5)t(1≤t≤5),表示資料的組數。

每組資料只有一行三個整數l, r, k(1 \le l \le r \le 10^9, 0 \le k \le 18)l,r,k(1≤l≤r≤10​9​​,0≤k≤18)。

輸出描述

每組資料輸出一行乙個數,表示答案。由於答案太大,你只需對10^9+710​9​​+7取模即可。10^9+710​9​​+7取模即可。
輸入樣例

2

1 2 5

2 3 5

輸出樣例

13

125

hint

第乙個樣例有13個數滿足,分別是:7,21,28,35,42,49,56,63,70,77,84,91,987,21,28,35,42,49,56,63,70,77,84,91,987,21,28,35,42,49,56,63,70,77,84,91,987,21,28,35,42,49,56,63,70,77,84,91,98
定義dp[i][j][k]表示位數為i,當前數%7的值而且以k結尾的方案數。

先列出dp方程,dp[i][x][ (t*10+x)%7 ]+=dp[i-1][j][t],因為i太大,所以要用矩陣快速冪加速。

#include #define ll long long   

#define mod 1000000007

using namespace std;

typedef vectorvec;

typedef vectormat;

mat mul(mat &a,mat &b)

return b;

} int main()

} }

for(int i=0;i<=9;++i) //求字首和必加,本題較於下題加這個的原因在於長度可以是1~l/1~r,下題只能是固定長度

a[70][i]=1; //求字首和必加,後面這個i(0~9)是指最終狀態可能性(餘數0,末位0~9)

a[70][70]=1; //求字首和必加

aa=pow(a,l-1);

bb=pow(a,r);

ll s1=0,s2=0;

for(int i=1;i<=9;++i)

cout<<(s2-s1+mod)%mod<[topcoder]給出n,k,計算 1k + 2k + 3k + ... + nk modulo 1000000007.

要實現求和長度在k左右的遞推式(n+1)^k-n^k=sigma(c[k][i]*n^i);

#include#define ll long long

#define mod 1000000007

using namespace std;

ll cc[55][55];

void permut()

for(int i=2;i<=50;++i)

return b;

} int main()

} //求字首和必加

for(int i=0;i<=k;++i)

a[k+1][i]=cc[k][i]; //這一步不理解(為什麼加的是cc[k][i])

a[k+1][k+1]=1;

b[0][0]=1;

a=pow(a,n);

b=mul(a,b);

cout

#include #define ll long long

#define mod 1000000007

using namespace std;

typedef vectorvec;

typedef vectormat;

mat mul(mat &a,mat &b)

return b;

} int num[11];

int main()

mat a(x+2,vec(x+2));

mat b(x+2, vec(1));

for(int i=0;i【快速冪變形】cd484c 一般做法會超時,但很難想到快速冪

//思路:首先 他是對1到k 元素做一次變換,然後對2到k+1個元素做一次變化。。。。依次做完。

// 如果我們對1到k個元素做完一次變換後,把整個陣列迴圈左移乙個。

// 那麼第二次還是對1 到 k個元素做和第一次一樣的變換,再左移,

// 再對1 到 k個元素做和第一次一樣的變換,依次做完n-k+1即可。

// 假設題目要求的變換為c 迴圈左移變換為p。那麼對於每次查詢 相當於做 n-k+1 cp)變換。

// 最後把答案再向右移動k-1 回到原來位置即可。

// 那麼問題就解決了 效率 每次查詢n log(n-k+1)

#includeusing namespace std;

char s[1000005];

char a[1000005];

int p[1000005];

int ans[1000005];

int tmp[1000005];

int main()

for(int j=0;j【poj3613】從s到e恰好經過n條邊的最短路(可以有重邊)。

#include#include#include#includeusing namespace std;

int n,t,s,e,num;

mapmp;

struct matrix

};matrix floyd(matrix a,matrix b)

matrix solve(matrix a,int k)

a=floyd(a,a);

k>>=1;

}return ans;

}int main()

a=solve(a,n-1); // n 條邊 ,經過 n-1 個點

printf("%d\n",a.ma[mp[s]][mp[e]]);

}return 0;

}

快速冪(矩陣快速冪)

求 3 0 3 1 3 n mod 1000000007 input 輸入乙個數n 0 n 10 9 output 輸出 計算結果 sample input 3sample output 40 分析 利用等比數列的求和公式得所求和是 3 n 1 1 2,如果暴力求3 n 1 會超時,這裡引入快速冪來...

快速冪 矩陣快速冪

快速冪 正常情況下求乙個數的冪時間複雜度為o n 而快速冪能把時間複雜度降到o logn 舉個例子 求5的13次方 思想首先把13化為二進位制 1101,即13 1101 8 1 4 1 2 0 1 1 即5 13 58 1 54 1 52 0 5 1 15 5 8 1 5 4 1 5 2 0 5 ...

快速冪 矩陣快速冪

快速冪 我們求a ba b ab最直接的方法就是把a乘b次這樣的話複雜度就是o n o n o n 但是在比賽時面對1e9的資料時還是會輕鬆超時的,此時就需要一種更快的乘法來幫助我們 我們把b拆成二進位制的形式得到a ba b ab a 10.01 a a1 0.01此時對b分解得到的序列10.01...