HDU 6395 區間矩陣快速冪

2021-08-23 12:05:17 字數 1392 閱讀 8526

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

所以 f3 = f1 * mat[ 0 ][ 1] + f2 * mat[ 0 ][ 0 ] + p / 3

f4 = f2 * mat[ 0 ][ 1] + f3 * mat[ 0 ][ 0 ] + p / 3

所以這裡要修改一下矩陣,把 p / n 也加進去

mat:

d 1 0

c 0 0

p/i 0 1

然後會發現 p / i 其實是有區間的,例如 p = 5 是   p / 1 = 5 ,  p / 2 = 2 , p / 3 = p / 4 = p / 5 = 1, p / 6 .... = 0

所以我們把 p 分區間做矩陣快速冪就可以了,然後在每個區間之間計算一次答案,運用到下乙個區間即可

#includeusing namespace std;

#define ll long long

#define mem(a,x) memset(a,x,sizeof(a))

const ll mod = 1e9 + 7;

ll f[5];

struct matrix

void init()

matrix operator*(matrix &mat)

ans.m[i][j] %= mod;

}} return ans;

}}x;

matrix ksm(matrix mat, int b)

mat = mat * mat;

b >>= 1;

} return ans;

}ll getr(ll i,ll n,ll p)else if(p / mid < num)else

} return l;

}int main()

mem(x.m, 0);

x.m[0][0] = d, x.m[0][1] = 1;

x.m[1][0] = c, x.m[2][2] = 1;

ll f1 = f[2],f2 = f[1];

for(ll i = 3; i <= n; )

printf("%lld\n",f1);

} return 0;

}

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...

hdu6395 分塊矩陣快速冪

題目大意 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 那...

hdu 4965 矩陣快速冪

給定兩個矩陣a,b,分別為n k和k n 求出矩陣c a b,矩陣m c n n 將矩陣m中的所有元素取模6,得到新矩陣m 並計算矩陣m 中所有元素的和 注意到ba 得到 6 6,而ab 得到1000 1000 轉化乘法算式為 m abababab.a ba n n 1 b 直接用矩陣快速冪即可 i...