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