WWWWWW不謹慎なブログについての宣伝
記事一覧-核融合炉のコア-羅Guboオフ
問題の意味の分析:
両図のセット、各既存の\(K \)番目、
第1グループの番号は次のとおり\(A_1、A_2、...、a_k \) 、前記
第2グループの数をそれぞれ\(B_1 、B_2、...、b_k \)表現。
デジタルの第二のセット(\ \下線\テキスト{}ペアワイズ質量\) 。
最小の非負整数シーク\を(N- \)、\
(\下線{\ {任意のテキスト満たさ} I、N - a_iをの\テキスト { である} b_iの\テキスト{}}割り切れる\) 。問題の意味によると、おそらく服用をに変換することができます。
次のように合同方程式を解くには:
\(\開始{ケース} X \当量A_1 \ PMOD {B_1} \\ X \当量A_2 \ PMOD {B_2} \\ ...... \\ X \当量A_N \ PMOD {B_N} \\\端{ケース} \)
以来\(BI \)の間のペアワイズ品質、それを使用することが可能である中国剰余定理を解決するために
、しかし、中国の剰余定理の適用範囲は、小さすぎる
と、ここで提示し、拡張中国剰余定理解決します。
合同解く方程式(拡張中国の剰余定理)
P4777 [テンプレート]中国剰余定理を拡大する(EXCRT)
次のように合同方程式を解くには:
\(\開始{ケース} X \当量A_1 \ PMOD {B_1} \\ X \当量A_2 \ PMOD {B_2} \\ ...... \\ X \当量A_N \ PMOD {B_N} \\\端{ケース} \)
ここで、\(a_iを、B_i \)負でない整数、\(B_1、B_2、...、B_N \)必ずしも互いに素
解決:
前に取得されているものと\(K-1 \)方程式の解\(X_ {K-1}
\) に配置された\(M = I = {LCM_。1. 1} ^ {K} -Bi \) 、すなわち、\を(M \)は正面である\(K-1 \)モジュラス\(Bの\)最小公倍数その後:
最初のため\(K-1 \)式が満たされている\(X_ {K-1}
+ TM \当a_iを\ PMOD {b_i} \ \ Zにおけるさ(t \)\) 、すなわち:前\(K -1 \)方程式、一般解の\(X_ {K-1} + TM \ \(ZにおけるT \)\)第得ることを望む\(K \)方程式の解、得られた溶液を、だけでなく、第一満たす\(K-1 \)式を
それは:
最初に必要である\(K \)方程式の解、前者\(K-1 \)方程式の解を通過すると、第一満たしながら\(K \)式の条件を。提供される:最初の\(K \)方程式の解\(X_K = X_ {K- 1} + TM \ \ Zにおけるさ(t \)\)
最初にこの溶液を代入(K \)\式が得られる:
\(X_ {K} 1-TM + \当a_k \ PMOD b_k} {\)
、すなわち:\(商標\ - K-当a_k-X_ { 1} \ PMOD {b_k} \
) ここで:\(M、a_k、K-X_ {} 1、\ b_k)が知られています。使用\(exgcdの\)は、この合同式を得ることができる解決\(T \)値。
\(T \)の値がバック置換されている\(K-X_K = X_ {} + TM。Z 1 \ \(T \)は\) 、得ることができる\(X_K \)値
ため\(K \)の動作時間後に、方程式の解を求めることができます。
この質問ピット:
データ範囲:
あなただけ開いた場合は、\(\長い長い\)私が取得するときは、とにかく爆破
ブラスト変数を避けるために、と呼ばれる技術を使用迅速な乗算剰余奇数\((BA)\)素晴らしい\((KA)\)アルゴリズムを。
(また、亀の速度乗算器として知られている)迅速乗算モジュロ
その本質とすぐに電源似た以上のものを取るためには、バイナリ分割アプリケーションです。
仮定\(K \)\(\)乗算
高速その中に分解することによって\(\回数2A \回 4A \回.... \) フォーム。
これは、エッジ側が破裂変数、データのオーバーフローを防止するために、残りを取ることができます。しかし、シフト乗算時間の複雑さは、
急に引か\(O(LOGN)\)レベルll mul(ll A,ll B,ll mod) //快速乘取余 模板 { ll ans=0; while(B>0) { if(B & 1) ans=(ans+A%mod)%mod; A=(A+A)%mod; B>>=1; } return ans; }
\(a_iを\)負であってもよいです。
拡張中国の剰余定理のみに適用されます\(a_iを、b_i \)非負の整数の状況を
私たちはしなければならない(a_iを\)\非負整数に変換されている
だけのことができ、このようなステップを追加する必要があります。for(int i=1;i<=n;i++) a[i]=(a[i]+b[i])%b[i];
合同の性質に応じて
明らかに正確。
タイトルコードをACに接続されています。
//扩展中国剩余定理模板
//详见注释
#include<cstdio>
using namespace std;
typedef long long ll;
ll n;
ll a[100010],b[100010];
ll mul(ll A,ll B,ll mod) //快速乘取余 模板
{
ll ans=0;
while(B>0)
{
if(B & 1) ans=(ans+A%mod)%mod;
A=(A+A)%mod;
B>>=1;
}
return ans;
}
ll exgcd(ll A,ll B,ll &x,ll &y) //扩展欧几里得 模板
{
if(!B)
{
x=1,y=0;
return A;
}
ll d=exgcd(B,A%B,x,y);
ll tmp=x;
x=y , y=tmp-A/B*y;
return d;
}
ll lcm(ll A,ll B) //求最小公倍数
{
ll xxx,yyy;
ll g=exgcd(A,B,xxx,yyy);
return (A/g*B);
}
ll excrt() //重点:求解同余方程组
{
ll x,y;
ll M=b[1],ans=a[1]; //赋初值
//M为前k-1个数的最小公倍数,ans为前k-1个方程的通解
for(int i=2;i<=n;i++)
{
ll A=M,B=b[i];
ll C=(a[i]-ans%B+B)%B; //代表同余方程 ax≡c(mod b) 中a,b,c
ll g=exgcd(A,B,x,y);
//求得A,B的最大公约数,与同余方程ax≡gcd(a,b)(mod b)的解,
if(C%g) return -1; //无解的情况
x=mul(x,C/g,B); //求得x的值,x即t
ans+=x*M; //获得前k个方程的通解
M=lcm(M,B); //更改M的值
ans=(ans%M+M)%M;
}
return ans;
}
int main()
{
scanf("%lld",&n);
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]);
for(int i=1;i<=n;i++)
scanf("%lld",&b[i]);
for(int i=1;i<=n;i++)
a[i]=(a[i]+b[i])%b[i];
ll ans=excrt();
printf("%lld",ans);
}
これは本当にこのような良いテンプレート数論を言って地方選挙のテスト