題目:
題意:矩陣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 水...