題解 SDOI 2011計算器

2021-08-15 18:45:12 字數 3575 閱讀 2151

bzoj

codevs

洛谷

給定

y y

, z' role="presentation">zz,

p p

,求 (1)yz(

modp

)' role="presentation">yz(

modp)y

z(modp

)(2)x∗

y≡z(

modp

) x∗y

≡z

(modp)

中x x

的最小非負整數解

(3)yx≡

z(modp

)' role="presentation">yx≡

z(modp)y

x≡z(

modp)中

x x

的最小非負整數解

(1)

快速冪求解

(2)

可以用擴充套件歐幾里得定理求解,但蒟蒻懶,就想用費馬小定理(ap

−1≡1

(modp)

' role="presentation">ap−

1≡1(

modp)a

p−1≡

1(modp),

p p

為質數)求逆元

ap

−1≡1

(modp)

' role="presentation">ap−

1≡1(

modp)a

p−1≡

1(modp),

p p

為質數

可得 a∗a

p−2≡

1(modp

)' role="presentation">a∗a

p−2≡

1(modp)a

∗ap−

2≡1(

modp),

p p

為質數

所以 a

' role="presentation">a

a的逆元a−

1=ap

−2a −1

=ap−

2但本小題中同餘號右邊不是

1 1

,不能直接使用費馬小定理求逆元,所以想法把右邊化為

1' role="presentation">11:

x∗y≡

z(modp

) x∗y

≡z

(modp)

⇔ ⇔

x∗y∗z−

1≡z∗

z−1(

modp

) x∗y

∗z−1

≡z∗z

−1

(modp)

⇔ ⇔

x∗y∗z−

1≡1(

modp

) x∗y

∗z−1

≡1

(modp)

因為

x x

與y∗z−

1' role="presentation">y∗z

−1y∗

z−1互為逆元 所以x

=(y∗

z−1)

−1x =(

y∗z−

1)−1

其中a a

的逆元a−

1=ap

−2' role="presentation">a−1

=ap−

2a−1

=ap−

2所以x=

(y∗z

p−2)

p−2 x=(

y∗zp

−2)p

−2

(3)

bsgs,具體就像分塊,可以在o(

p‾√)

o (p

)內求解yx

≡z(modp)

y x≡

z(

modp

)因為y

0≡1(

modp

) y0≡

1(

modp

)且yp

−1≡1

(modp)

y p−

1≡1(

modp

),所以只用考慮x∈

[1,p

−1] x∈[

1,p−

1]

即可用分塊思想,設m=

p‾√ m=p

然後可以預處理出yi

,i∈[

0,m]

y i,

i∈[0

,m

]接著從z

z

依次除以ym

' role="presentation">ymy

m,為了方便mod運算,乘以逆元(y

m)−1

=yp−

m−1 (ym

)−1=

yp−m

−1

(同樣由費馬小定理得出)

一旦遇到yi

,i∈[

0,p‾

√]y i,

i∈[0

,p

],則答案ans=下降(除以ym

y

m)的次數×

m m

+i' role="presentation">ii

擴充套件bsgs的筆記還沒寫,以後也許會補上筆記

三道小題之間還是分得很清楚的

#include

using

namespace

std;

typedef

long

long ll;

#define rg register

template

inline

void read(_tp&x)

inline ll qpow(ll a,ll b,ll mod)

return ans;

}int main()

return

0; }

if(opt==2)

return

0; }

if(opt==3)

if(b==1&&!a)

if(a%p==0&&b)

a%=p,b%=p;

mp.clear();

ll m,v,base=1;

m=ceil(sqrt(p+0.5));

v=qpow(a,p-m-1,p);

mp[1]=m;

for(rg int i=1;iif(!mp[base=base*a%p])mp[base]=i;

for(rg int i=0;iif(mp[b])

b=b*v%p;

}puts("orz, i cannot find x!");

con: ;

}return

0; }

puts("fck");

return

0;}

SDOI2011 染色 題解

題目大意 給定一棵有n個節點的無根樹和m個操作,操作有2類 1 將節點a到節點b路徑上所有點都染成顏色c 2 詢問節點a到節點b路徑上的顏色段數量 連續相同顏色被認為是同一段 思路 樹剖之後,維護其兩端的顏色 答案和標記即可。include include define n 100001 using...

SDOI2011 飛彈攔截 題解

論printf lf 0.0 的重要性 給你nn 個三維的點 x,y,z x,y z 求出最長的三維不下降序列,並輸出每乙個點在最長的序列上的概率。這個肯定和普通的飛彈攔截不同了,普通的是沒有速度的,也就是二維的,且時間一維已經有序,那麼對高度求乙個lis lis 最長不下降序列 就好了。但是現在還...

SDOI 2011 黑白棋 題解

題目傳送門 題目大意 有乙個 1 n 1 times n 1 n 的棋盤,上面有 k kk 顆棋子,一半白一半黑,並且相鄰棋子顏色不同,兩個人輪流操作,乙個人只能將白棋子右移,乙個人只能將黑棋子左移,每個人一次最多移動 d dd 顆棋子,問有多少種局面先手必勝 先手操作白棋子 將相鄰的一對黑白棋子看...