2019牛客暑期多校訓練營(第九場)

2022-05-19 20:22:16 字數 3417 閱讀 2809

給定$p=1000000007$

有兩個數x,y,其中$x\leqslant y \leqslant p$

$x + y \equiv b(mod  \ p)$

$x \times y \equiv c (mod \ p)$

求 x,y的值

二次剩餘

[1]二次剩餘參考資料1

[2]二次剩餘參考資料2

知道 $x+y$ 和 $ x \times y $

那計算x,y 自然是$  (  x-y )^} = (  x+y )^} - 4xy = b^-4c $ 

設$b^-4c = d$,利用二次剩餘求解

\begin

1,&d^}\text\\

-1,&d^}\text\\

0,&d^}\equiv0\pmod p

\end

有解時:

①當 $d=0$ 時,兩個解相等,都為$\frac$

②當d是 $mod \ p$ 的平方剩餘時有$d^} \equiv 1 (mod \ p)$ 

設$p-1=2^\times s,(2∤s)$,顯然$t=1$

所以$ (  x-y )=d^}$是$(  x-y )$的乙個解

所以$x-y=d^}= d^}$

由於$p=1000000007$,所以$ (p+1) \ mod \ 4 =0$可行

因為$x-y= d^}$,所以$(x - y)\mod \ p \equiv d^} \ mod \ p$ 設為 a

然後再利用 $x + y \equiv b(mod  \ p)$

$\left \^ \right.$

得到x,y

注意 此時是在模p的情況下,

在除以2的時候記得除法取模

$\frac \ mod \ p = mn^ \ mod \ p$

1 #include2

using

namespace

std;

3#define ll long long

4#define p 1000000007

5ll qpow(ll a,ll b)615

return

res;16}

17int

main()

1842

else

43 cout<

<

'<

<

45}46 }

view code

給出乙個長度為n的集合a,

從中選任意個數,使得這些數的和為s

由於長度最大為36,一共有$2^$種情況

挨個列舉肯定會tle

利用折半列舉,兩個$2^$

1 #include2

using

namespace

std;

3#define ll long long

4 mapint>mp;

5 ll a[40];6

intmain()723

24for(int i=0;i

<

2541

}42 }

view code

一開始有n個人不認識。有m個回合,他們中的兩個輪流交朋友。

朋友關係是相互的、可傳遞的。

如果a是b的朋友,那麼b也是a的朋友。

例如,如果a是b的朋友,b是c的朋友,那麼a和c是朋友。

在開始和每個回合之後,請計算從中選擇四個人的方法的數量,這樣這四個人中的任何兩個都不是朋友。

假設現在有5個朋友圈a,b,c,d,e

5個朋友圈裡的人數分別為a,b,c,d,e

那麼現在的方式有$(abcd+abce+abde+acbd+acde)$種

此時令a b做朋友,也就是a b朋友圈合併

那現在的方式有$((a+b)cde)$,也就是$(acde+bcde)$種

減少了$(abcd+abce+abde)$,即$ab(cd+ce+de)$種

因為$cd+ce+de=((c+d+e)^-(c^+d^+e^))/2$

用乙個$n$代表總人數,$s$記錄所有集合的平和方

可以把$(c+d+e)$看做$(n-a-b)$,把$(c^+d^+e^)$看做$(s-a^+b^)$

我們可以利用並查集合並、查詢集合,

由於每次時兩個集合合併,a,b不合併的平方和為$a^+b^$

合併後的平方和為$(a+b)^=a^+b^+2ab$

所以每次合併後$s+=2ab$

注意 當所有集合都不合併時答案$\textrm_^$可能會long long溢位,

所以使用unsigned long long

1 #include2

using

namespace

std;

3#define ll unsigned long long

4int

const maxn=2e5+5;5

intpre[maxn];

6ll num[maxn];78

int find(intx)9

21return

r;22}23

24void mix(int x,int

y)2533}

3435

intmain()

3644

45 ll ans=n*(n-1)/2*(n-2)/3*(n-3)/4

;46 ll s=n;

47 printf("

%lld\n

",ans);

48int

a,b;

49for(int i=1;i<=m;i++)

5058

if(a==b)

5963 ans-=num[a]*num[b]*((n-num[a]-num[b])*(n-num[a]-num[b])-(s-num[a]*num[a]-num[b]*num[b]))/2

;64 s+=2*num[a]*num[b];

65 printf("

%lld\n

",ans);

66mix(a,b);67}

68return0;

69 }

view code

2019牛客暑期多校訓練營(第九場)

d knapsack cryptosystem 折半搜尋,晚上又去看了挑戰程式設計,對於時間複雜度高的情況,可以通過犧牲空間來降低時間複雜度。先把前半部分所有可以組合的情況列舉出來,然後對於後半部分依次列舉,那麼複雜度變化為o 2 36 o 2 18 2 18log 18 顯然就可做了,折半的裸題。...

2020牛客暑期多校訓練營(第九場)

總結 這一場過了a題,之前用c 各種寫,但是沒想到用 三行 就解決了問題,還是需要學習很多很多。fi 一級目錄 土撥鼠在第1個宿舍,橙子在第n個宿舍。這n個宿舍間有n 1條路並且長度都為1,土撥鼠從第1個房間去第n個宿舍,速度為1m s 橙子從第n個宿舍追趕土撥鼠,速度為2m s。二分時間 t 然後...

牛客網暑期ACM多校訓練營(第九場)

做法 看到下標 xor 這種情況就想 fwt 可是半天沒思路,於是放棄了。其實這個 n 瘋狂暗示啊。設未知數向量為 x 列一下方程組就可以發現有 b k sum a i x j 做法就顯然了吧,把 a 和 b 分別 fwt 對應相除然後反變換即可。表示前天才學的 fwt 就不會使了。include ...