P3868は、[[TJOI2009]ゲス]問題への解決策

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 \)の動作時間後に、方程式の解を求めることができます。

  • この質問ピット:
    1. データ範囲:

      あなただけ開いた場合は、\(\長い長い\)私が取得するときは、とにかく爆破

      ブラスト変数を避けるために、と呼ばれる技術を使用迅速な乗算剰余奇数\((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;
         }
    2. \(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);
}

これは本当にこのような良いテンプレート数論を言って地方選挙のテスト

おすすめ

転載: www.cnblogs.com/luckyblock/p/11456391.html