BZOJ2118 莫莫的等式

2022-03-31 14:18:19 字數 1619 閱讀 1348

目錄題目傳送門

又是比較妙的一道題目,聽說這個方法似乎是叫同餘類\(bfs\)?感覺有點像最短路啊。。

問題轉化一下,實際上就是乙個無限揹包的問題了。我們記\(t\)為\(ai\)中最小的數,接下來考慮\(dis[i]\)表示能夠構成乙個數\(q\),且\(q\)

\(mod\)

\(t=i\),並且\(q\)為滿足條件的最小的數,然後我們對於\([bmin,bmax]\)中的每乙個數\(x\),存在三種情況:

1.\(dis[i]>x\),那麼說明滿足條件的最小的數也大於\(x\),說明\(x\)無法構成。

2.\(dis[i]=x\),那麼說明滿足條件的最小的數剛好是\(x\),說明\(x\)可以構成。

2.\(dis[i],那麼說明滿足條件的最小的數比\(x\)小,且\(q\)

\(mod\)

\(t=x\)

\(mod\)

\(t\),那麼\(x\)可以由\(q\)加上若干個\(t\)得到,說明\(x\)可以構成。

綜上,如果\(dis[i]\leq x\),那麼\(x\)是可以構成的。

所以我們預先跑一邊最短路,處理出\(dis\)陣列,然後列舉\(0...t-1\)每乙個數,計算貢獻即可。

#include using namespace std;

typedef long long ll;

bool finish_read;

templateinline void read(t &x)while(isdigit(ch))x=x*10+ch-'0',ch=getchar();x*=f;finish_read=1;}

templateinline void print(t x)

templateinline void writeln(t x)

templateinline void write(t x)

/****************=header template**********====*/

#define pause printf("press enter key to continue..."); fgetc(stdin);

const int m=5e6+500;

const int n=5e5+500;

typedef pairp;

#define fi first

#define se second

struct edge e[m];

int head[n],vis[n],a[n];

int n,tot;

ll mn,mx;

ll dis[n];

/****************===define area***************=*/

void addedge(int u,int v,int w)

void dj()

} }}int main()

sort(a+1,a+1+n);

if(a[n]==0) return puts("0"),0;

for(int i=0;imx) r--;

ans+=r-l+1;

} }printf("%lld\n",ans);

return 0;

}

bzoj 2118 墨墨的等式

又是好一道數論題!令mn為a 1 a n 中數的最小值。很顯然,如果x能被湊出來,x mn也能被湊出來。所以我們只需要知道對於每乙個x屬於 0,mn 滿足y mn x中最小的y,那麼就能知道 1,r 中模mn等於x的數里能湊出來的個數。注意spfa的時候正無窮要大一點 需要特殊處理一下a 0的情況,...

bzoj2118 墨墨的等式

time limit 10 sec memory limit 259 mb submit 878 solved 337 submit status discuss description 墨墨突然對等式很感興趣,他正在研究a1x1 a2y2 anxn b存在非負整數解的條件,他要求你編寫乙個程式,給...

BZOJ 2118 墨墨的等式

這道題太tm神了。智商 啊 好題啊!找乙個ai,若x為合法的b,則x ai也合法 設bi為最小的x,滿足x mod mn i 求出每個bi就可以求答案了 bi用最短路求就好了啊 意會一下 最後列舉餘數搞一下就算出答案了 好短啊2333 include using namespace std type...