給定$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 #include2view codeusing
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 }
給出乙個長度為n的集合a,從中選任意個數,使得這些數的和為s
由於長度最大為36,一共有$2^$種情況挨個列舉肯定會tle
利用折半列舉,兩個$2^$
1 #include2view codeusing
namespace
std;
3#define ll long long
4 mapint>mp;
5 ll a[40];6
intmain()723
24for(int i=0;i
<
2541
}42 }
一開始有n個人不認識。有m個回合,他們中的兩個輪流交朋友。朋友關係是相互的、可傳遞的。
如果a是b的朋友,那麼b也是a的朋友。
例如,如果a是b的朋友,b是c的朋友,那麼a和c是朋友。
在開始和每個回合之後,請計算從中選擇四個人的方法的數量,這樣這四個人中的任何兩個都不是朋友。
假設現在有5個朋友圈a,b,c,d,e5個朋友圈裡的人數分別為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 #include2view codeusing
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 }
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 ...