小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 15 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層...