BZOJ 2118 墨墨的等式 最短路 同餘類分析

BZOJ 2118 墨墨的等式 最短路 同餘類分析

一. 題目

墨墨突然對等式很感興趣,他正在研究a1x1+a2x2++anxn=B 存在非負整數解的條件,他要求你編寫一個程序,給定Nai 的值以及B 的取值範圍,求出有多少B 可以使等式存在非負整數解。

對於100 的數據,
N120ai5105
1BMinBMax1012

二. 分析

[l,r] 等價於 求[1,r][1,l1]
即考慮一個數B ,求所有不大於B 的非負整數中有多少個能被表示即可。

首先的想法:
fi 表示能否湊到i ,則有:
①邊界:f0=true
②遞推:fi=fia1fia2...fian
然後枚舉0B 的所有值,進行計數。
然而B 太大,會超時。

既然B 太大,那麼這時要有兩種思路:①對B 的大小分塊 ②按照同餘對值分類。
方法①應該不行,考慮方法②。

注意到數據範圍0ai5105 ,我們選取任意的A=an ,將按值把所有方案分成A 類。
這樣的話,任何一個方案都屬於其中的一個類。

這樣 原問題 等價於 求滿足下列兩個條件的數的個數 :
a1x1+a2x2+...+an1xn1B(modA)
a1x1+a2x2+...+an1xn1B

我們假如能求出一個類中能湊出的數的個數,將A 個類的個數相加即爲結果。
現在只用考慮求屬於一個類的能湊出的數的個數。

假如可以湊出值p ,那麼一定可以湊出值p+qA
對於每一個類,我們知道上界B ,假如也知道屬於該類的能湊出的最小值p ,那麼這個類中,我們可以湊到的數有且僅有:

p,p+A,p+2A,...,p+qA(p+(q+1)A>B)

這可以在O(1) 內求得,個數爲BpA+1

現在要求每一類中最小的能湊出的值。
這用SPFA,Dijsktra等算法皆可求出。

三. 代碼

(以前的代碼,懶得重新寫了)

#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;

typedef long long LL;
const int N=13;
const int M=500001;
const LL MAX=10000000000000;

int n; LL BMin,BMax;
int p[N],vtx;
LL dis[M]; int q[M],h,t,v[M];

inline LL query(LL w)
{
    LL cnt=0;
    for (int i=0;i<vtx;i++)
        if (dis[i]<=w) cnt+=(w-dis[i])/vtx+1;
    return cnt;
}

int main(void)
{   
    scanf("%d%lld%lld",&n,&BMin,&BMax);

    for (int i=1;i<=n;i++) scanf("%d",&p[i]);
    vtx=p[1]; for (int i=2;i<=n;i++) if (vtx>p[i]) vtx=p[i];

    int now,nxt;
    for (int i=1;i<vtx;i++) dis[i]=MAX;
    v[q[t=1]=0]=1;
    for (;h^t;)
    {
        v[now=q[h=h%vtx+1]]=0;
        for (int r=1;r<=n;r++)
        {
            nxt=(dis[now]+p[r])%vtx;
            if (dis[now]+p[r]<dis[nxt])
            {
                dis[nxt]=dis[now]+p[r];
                if (!v[nxt])
                {
                    v[nxt]=1;
                    q[t=t%vtx+1]=nxt;
                }
            }
        }
    }

    printf("%lld\n",query(BMax)-query(BMin-1));

    return 0;
}

四. 小結

1. 權值過大的調整

我們在使用基於權值的數組計算時,可能會應該目標太大而出現MLE和TLE的情況。
假如還是使用相同的方法,我們可以做如下幾種常見的調整:離散化按權值大小分塊同餘類分析

2. 同餘類分析

權值過大的時候,考慮使用這種方法。

這種問題求解的,通常是方案存在性問題方案計數問題

一般選取的同餘值A ,要滿足:若方案值爲p 是可以的,那麼方案值爲p+A 也是可以的

發佈了65 篇原創文章 · 獲贊 9 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章