十進位制快速冪

2021-06-20 07:43:44 字數 2871 閱讀 2792

題目:

題意:矩陣f滿足以下遞推式

輸入八個整數n,m,a,b,c,d,e,f,輸出f[n][m]%2012182013的值。

分析:本題需要構造矩陣,那麼首先我們根據遞推式

可以構造

可以看出,我們還需要求f[n][2]和f[n][1]的值。那麼繼續,根據

我們先利用上面的式子消去下面式子中的f[i][1]得到

所以有矩陣

那麼,與開始的矩陣連起來就得到

可以看出,這樣就構成了關於n的矩陣遞推關係。那麼進一步得到

那麼,我們再根據前面的關於m的矩陣遞推下去得到

這樣,我們就可以計算了,但是這裡有乙個問題,就是冪m和n會很大,那麼對於矩陣,實際上是不能用費馬小定理降冪的,那麼我們有一種方法,叫做十進位制快速冪。它的原理基本和二進位制快速冪差不多,模擬一下就知道了,很容易的。

在smartoj上貌似評測機速度慢,得到的結果是tle,連別人ac過的**都t,也就只能這樣了,關鍵是掌握方法即可。

#include #include #include #include using namespace std;

typedef long long ll;

const int n = 3;

const ll mod = 2012182013;

string nn,mm,aa,bb,cc,dd,ee,ff;

struct matrix

;matrix i =

;matrix multi(matrix a,matrix b)

return ans;

}matrix t_power(matrix a,string str) //十進位制快速冪

return ans;

}ll module(string str,ll mod)

else

}if(str[0] == '0' && str.length() > 1)

str.erase(0,1);

}int main()

{ while(cin>>nn>>mm>>aa>>bb>>cc>>dd>>ee>>ff)

{ll a = module(aa,mod);

ll b = module(bb,mod);

ll c = module(cc,mod);

ll d = module(dd,mod);

ll e = module(ee,mod);

ll f = module(ff,mod);

matrix a;

a.m[0][0] = b;

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

a.m[0][2] = c;

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

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

a.m[1][2] = 0;

a.m[2][0] = 0;

a.m[2][1] = 0;

a.m[2][2] = 1;

sub(mm,2);

matrix ans1 = t_power(a,mm);

matrix b;

b.m[0][0] = (d + e * e % mod) % mod;

b.m[0][1] = d * e % mod;

b.m[0][2] = (f + e * f % mod) % mod;

b.m[1][0] = e;

b.m[1][1] = d;

b.m[1][2] = f;

b.m[2][0] = 0;

b.m[2][1] = 0;

b.m[2][2] = 1;

sub(nn,1);

matrix ans2 = b;

matrix ans = multi(ans1,ans2);

ans = t_power(ans,nn);

ans = multi(ans,ans1);

ll res = (ans.m[0][0] + ans.m[0][1]) % mod;

res = (res + ans.m[0][2]) % mod;

cout<

題目:

題意:矩陣f滿足以下條件

求f[n][m]%1000000007的值。

分析:當然這個題做法實際上跟上面的題做法一樣,用十進位制快速冪就能ac,但是你會發現用費馬小定理降冪同樣對,在這裡由於資料的特殊性恰好避開了使用費馬小定理出錯的情況,十進位制快速冪才是正解。由於基本與上題一樣,就不貼**了。

十進位制快速冪

problem 2 input file power.in output file power.out time limit 1 second memory limit 256 mb mr.ding 打算考一道比較顯然的題目,低頭一想,就有了這道題。mr.ding 需要你計算 3 n mod 10 ...

矩陣 十進位制快速冪 NOI2013 矩陣遊戲

婷婷是個喜歡矩陣的小朋友,有一天她想用電腦生成乙個巨大的 n 行 m 列的矩陣 你不用擔心她如何儲存 她生成的這個矩陣滿足乙個神奇的性質 若用 fi,j 來表示矩陣中第 i 行第 j 列的元素,則 fi j滿足下面的遞推式 f 1,1f i,jf i,1 1a fi,j 1 bc f i 1,m d...

十進位制 十六進製制

把十進位制整數轉換為十六進製制,格式為0x開頭,10 15由大寫字母a f表示。input 每行乙個整數x,0 x 2 31。output 每行輸出對應的八位十六進製制整數,包括前導0。sample input 0 1023 sample output 0x00000000 0x000003ff 水...