hihoCoder1345 小h的朋友們

2021-07-15 04:41:26 字數 2071 閱讀 1460

小h很多朋友。他給第i個朋友分配了乙個代號ai,並使代號序列滿足如下關係:ai 

= (k

1 * a

i-1 

+ k2 

* ai-2

) mod 1,000,000,007

現在小h忘記了第z個朋友的代號az,但是他記得第x個朋友和第y個朋友的代號ax和ay。

小h很著急,向小y求助。小y很忙,把任務交給了你,希望你求出第z個朋友的代號。  

第一行共2個整數,k1,k2;

第二行共4個整數,x,y,ax,ay;

第三行共1個整數,z。

3<=x,y,z<=1018   0<=k1,k2

<=105

輸入資料保證有解,且解唯一

共一行1個整數,az。

樣例輸入

1 1

5 7 5 13

10

樣例輸出

55

這個題中文題意明顯,給你個遞推關係,給你第x項,第y項的值,求第z項的值。

xyz又那麼大,明顯矩陣快速冪。求第z項值就要知道初始的兩個值才可以。那就是利用第x,y項來列方程求解了。

初始矩陣u為:   

[ a1  a2]   

[ 0    0]     

遞推矩陣i為: 

[ 0  k2] 

[ 1  k1]

當然不唯一,保證遞推關係成立就可以了

其實u的a2為當前值,這是第二個,那麼 u×i^(x - 2) 得到x項矩陣,   u×i^(y-2)得到第y項矩陣,x,y項的值都知道了,乘一下列方程組

a1*x1 + a2*x2 = x

a1*y1 + a2*y2 = y

接下來消去一項求另一項,再帶入求剛才消去的那一項。這個過程中的減法需要加mod再取模以免為負數,各種乘法都要乘一次取一次模,除法乘逆元,因為模的是指數,直接快速冪費馬小定理求逆元。a^(p-2) = 1/a mod(p)。

#include #include #include #include const int n = 1000001;

typedef long long ll;

using namespace std;

int mod = 1000000007;

struct mat

void set0()

void set1()

mat operator * (const mat& b)const

return c;

}};mat operator ^ (mat a, ll x)

return ret;

}ll pow(ll a, ll x)

return ret;

}int main()

{ ll k1, k2;

ll x, y, ax, ay, z;

while (cin >> k1 >> k2)

{cin >> x >> y >> ax >> ay >> z;

mat tx, ty, one;

one.a[0][0] = 0;

one.a[0][1] = k2;

one.a[1][0] = 1;

one.a[1][1] = k1;

ty = one ^ (y - 2);

tx = one ^ (x - 2);

ll &x1 = tx.a[0][1], &x2 = tx.a[1][1], &y1 = ty.a[0][1], &y2 = ty.a[1][1];

ll up = ((ax*y1%mod - x1*ay%mod) + mod)%mod;

ll a2 = up * pow(( (x2*y1 % mod - x1*y2 % mod) + mod)%mod, mod - 2) %mod;

ll a1 = (ax - x2*a2%mod + mod)%mod;

a1 = a1 * pow(x1, mod - 2) %mod;

mat i;

i.a[0][0] = a1;

i.a[0][1] = a2;

i = i * (one ^ (z - 2));

cout<

Hihocoder 小Hi的煩惱

解題思路 其實題目自帶的題解已經交代的比較清楚了。但是如果完全按照題目自帶的解法來計算,肯定是會超時的。因為無論如何還是o n 2 的解法,當然也可能是彩筆我比較菜只能寫出這樣的。所以需要一些轉換。這個題目給的記憶體空間為1024m,顯然我們要用空間換時間了。就以單個科目為例吧。假設a i 表示第i...

hihoCoder 1606 小Hi和小Ho的密碼

時間限制 10000ms 單點時限 1000ms 記憶體限制 256mb 描述小hi和小ho一直使用加密的方式傳輸訊息。他們使用如下方法來生成一組密碼 首先小hi和小ho選擇乙個整數 n pk 其中p質數 k是正整數,也即n是質數或質數的冪 其次,他們會求出兩個整數a和b滿足0 a b n,並且,n...

小Ho的防護盾 hihoCoder

時間限制 10000ms 單點時限 1000ms 記憶體限制 256mb 小ho的虛擬城市正在遭受小hi的攻擊,小hi用來攻擊小ho城市的 是一艘殲星艦,這艘殲星艦會以t t為大於0的整數 個單位時間的間隔向小ho的城市轟擊。殲星艦總共有n枚炮彈,其中第i枚會造成ai點傷害值。幸好小ho的城市有k層...