題目大意:
f(1)=a, f(2)=b, f(i)=c*f(i-2)+d*f(i-1)+p/i(向下取整)
給定a b c d p n
求f(n)
構造矩陣a * 矩陣b = 矩陣c
┌ f(n-2) f(n-1) 1 ┐ ┌ 0 c 0 ┐ ┌ f(n-1) f(n) 1 ┐
| 0 0 0 | * | 1 d 0 | = | 0 0 0 |
└ 0 0 0 ┘ └ 0 p/i 1 ┘ └ 0 0 0 ┘
那麼當a為第一項時 a*(b^n)=第n項
因為p/i向下取整所以在 1~n的範圍中 p/i的數值是多段相等的
如n=10 p=15 那麼1~n中 p/i為 15 7 5 3 3 2 2 1 1 1
改變b中的p/i 分別求b^len 即 b^1 b^1 b^1 b^2 b^2 b^3
已知 p / i = x 那麼len = min( p / ( p / i ) , n ) 都是int型向下取整
就得到了分塊的 b^n
#include usingview codenamespace
std;
#define inf 0x3f3f3f3f
#define llinf 0x3f3f3f3f3f3f3f3f3f
#define ll long long
#define mem(i,j) memset(i,j,sizeof(i))
const
int n=3
;const
int mod=1e9+7
;ll a,b,c,d,p,n;
struct
mat
mat
operator*(mat p)
}ans,pow;
mat mod_pow(mat a,
intx)
return
res;
}int
main()
printf(
"%lld\n
",ans.a[0][1
]); }
return0;
}
hdu 6395 (整除分塊 矩陣快速冪)
該題的表示式是 fn fn 1 1 3dc pn 1 0000 1 fn 1 fn 2 1 left begin f n f 1 end right left begin3 d c frac 1 0 0 0 0 1 end right left begin f f 1 end right fn fn...
HDU 6395 區間矩陣快速冪
hdu 6395 傳送門 題目裡有公式顯示不了,直接傳送門 公式 f1 a f2 b fn fn 2 c fn 1 d p n 其中 a b c d p n 均為不定值,p n 為計算機整數除法,即向下取整 很明顯的是 前 2 項 c 前 1 項 d,所以矩陣很好構造 mat d 1 c 0所以 f...
hdu 6395 Sequence 分塊矩陣快速冪
容易知道 p i i 3.n 在某一區間內是相同的,記錄前乙個區間的fn 1,fn 2,對本區間進行矩陣快速冪,確定本區間的界限可以用一句話 即 j p i 0?n min n,p p i 並不需要二分 ac include include include include include inclu...