time limit:1000 ms
memory limit:131072 kbytes
給定n與p,求\(\left\lfloor x^n\right\rfloor \% p\),x=\(\frac+1}\)。
輸入一行,兩個非負整數n,p。
輸出乙個整數,表示答案
5 97
今天寫道數學題吧owo
這道題我們看到\(\frac}1}}\),那麼我們容易想到另乙個無理數\(\frac\)對吧?
因為這兩個無理數是方程\(t^2-t-1=0\)的兩根
那麼數學好的大佬肯定一眼看出這個特徵方程對應的遞推通式是\(f[i]=f[i-1]+f[i-2]\)
我們首先設\(x1=\frac}1}}\),\(x2=\frac\)
那麼其實這個遞推式的通式其實就是\(f[n]=c1*x1^n+c2*x2^n\)
具體這個遞推式是什麼呢?我們並不在乎對吧(引用:我又不是數學老師)
為了得到\(x1^n\),我們不妨假設這個遞推式的通項式為\(f[n]=(\frac}1}})^n+(\frac)^n\)
首先我們將0,1帶入遞推通式得到\(f_0=2,f_1=1\),那麼我們所得到的遞推式每一項都必然是乙個整數
由於\(-1<\frac<0\),顯然\(\begin
-1<(\frac)^n<0& \text \\
0<(\frac)^n<1& \text
\end\)
那麼我們只要對於n的奇偶性討論一下,如果是奇就直接輸出\(f[n]\),否則輸出\(f[n]-1\)
剩下就是乙個矩陣乘法求遞推第n項,因此很容易求解
#includelong long n;
int zqm,f0,f1;
struct ra,c;
r operator *(r a,r b)
int main()
if (n==1)
n-=2;
int ans=0;
if (!(n&1)) ans--;
a=(r);
c=a;
while (n)
ans=(c.a*1ll*f1+f0*1ll*c.b+ans)%zqm;
printf("%d",ans);
return 0;
}
一道模擬賽的題
這是乙個不錯的題啊,在這裡記錄一下 聽說不是原創題,那我就放上來了。應該沒有關係吧qaq 有乙個 n m 的地圖,地圖上的每乙個位置可以是空地,炮塔或是敵人.你需要操縱炮塔消滅敵人.對於每個炮塔都有乙個它可以瞄準的方向,你需要在它的瞄準方向上確定乙個它的攻擊位置,當然也可以不進行攻擊.一旦乙個位置被...
Noip模擬賽 C(一道環套樹的神奇題目)
前置知識 乙個聯通圖沒有有偶環 它是環套樹或者樹 仙人掌 沒有2個環共用相鄰的邊 over 為啥呢 因為若是2個環有相鄰的邊,那麼就存在乙個大環的邊數 奇 奇 2 重複的邊,顯然這是乙個偶數 over 環套樹的一些性質 m n 自己想去 所以對於乙個奇環森林就可以做到每個點配對乙個邊。好,現在考慮題...
noip模擬賽 拼不出的數
分析 如果每個數可以選任意多次,那麼就是乙個很普通的dp問題,這裡每個數只能選一次,還是考慮dp,設f i 表示1 i是否都能選上.考慮下乙個數j,如果j i 1,那麼i 1這個數就選不上,答案就是i 1,否則f i 可以轉移到f i j 這個演算法是建立在集合有序的情況下的,所以要先排序.incl...