NOIP2017 題解 給自己看的 有坑要填

2022-03-26 01:27:37 字數 2842 閱讀 5711

目錄幾道水題就不寫了....

把ax+by = z 的z按照模a剩餘系分類

由於\((a,b)=1\)所以對於每個\(k\in[0, a)\), \(k\cdot b\)都在不同剩餘系內!!(反證法)

那麼自然最大的取不到數在(a-1)*b的剩餘系內, 也就是\((a-1)*b - a = ab-a-b​\)

orz gxz:

(記憶化搜尋?)

70分做法顯然

100分做法: 思想是把dp轉移抽象為dag

如果不是dag: 只要可轉移到終點的合法狀態不在環內就可以正常dp

否則puts("-1")

p.s. 只要在topsort中環加外向樹上的點(illegal points) 入度都大於0 , 所以topsort一遍就ok拉!!!

這道題卡常喪心病狂...

這個程式會re(60分)...不敢開longlong... 求dalao debug..

#includeusing namespace std;

typedef pairpii;

#define fi first

#define se second

#define pb push_back

#define rep(_i, _st, _ed) for(register int _i = (_st); _i <= (_ed); ++_i)

#define per(_i, _ed, _st) for(register int _i = (_ed); _i >= (_st); --_i)

inline int read()

const int maxn = 1e5+5, maxm = 3e5+5, mxk = 51;

int n, m, p;

//鄰接表

struct graphedge[maxm];

int head[maxn];

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

//精簡dijstra

priority_queuepq;

int dis[maxn]; bool vis[maxn];

void dijstra()}}

}int t, k;

const int mxhsh = maxn*mxk;

int f[mxhsh], ind[mxhsh], le[mxhsh], ri[mxhsh], cnt, pt[mxhsh], q[mxhsh];

#define hsh(_k, _u) ((_k)*n + _u)

#define mod(_cur) if(_cur > p) _cur -= p;

signed main()

dijstra();

//構建狀態轉移圖 (該題中為一種擴充套件最短路圖)

cnt = 1; memset(ind, 0, sizeof ind);

rep(u, 1, n) rep(x, 0, k)

ri[hsh(x, u)] = cnt - 1;

}//拓撲排序 + 狀態轉移

memset(f, 0, sizeof f);

f[hsh(0, 1)] = 1;

int fr = 1, bk = 0;

rep(i, 1, hsh(k, n)) if(!ind[i]) q[++bk] = i;//這句必須有!!常數再大也要加!!!

while(bk >= fr)

}//統計答案

int infini = 0, ans = 0;

rep(x, 0, k)

if(infini) puts("-1");

else printf("%d\n", ans);

}return 0;

}

正解\(o(3^nn^2)\)....

注釋很詳細了

//這題卡常!!!

#includeusing namespace std;

typedef pairpii;

#define fi first

#define se second

#define pb push_back

#define rep(_i, _st, _ed) for(register int _i = (_st); _i <= (_ed); ++_i)

#define per(_i, _ed, _st) for(register int _i = (_ed); _i >= (_st); --_i)

inline int read()

#define min(a, b) ((a) < (b)) ? (a) : (b) //注意在這個巨集定義中a, b都會算兩次

int f[13][10005];

int n, m, mat[15][15], log_2[10005], mincost[15];

signed main()

log_2[0] = 1;

rep(i, 1, n) log_2[(1 << i)] = i;

int mxsta = (1 << n) - 1, ans = 1e8;

memset(f, 0x2f, sizeof f);

rep(u, 0, n-1) f[0][(1

//不重複列舉補集的子集

for(int sub = rev; sub; sub = (sub-1) & rev)

//cout

rep(i, 0, n)

cout

}

noip2017解題報告題解

noip 2017 提高組題解 by 杜瑜皓 november 12,2017 1 math 輸出 ab a b。因為如果 x,y 是 ax by n 的一組解,那麼 x bt,y at 也是一組解,容易發現最大的不滿足的 x,y 為 1,a 1 b 1,1 即 n ab a b 無解。2 comp...

Noip2017普及組題解 成績(C )

牛牛最近學習了 c 入門課程,這門課程的總成績計算方法是 總成績 作業成績 20 小測成績 30 期末考試成績 50 牛牛想知道,這門課程自己最終能得到多少分。輸入只有 1 行,包含三個非負整數a b c,分別表示牛牛的作業成績 小測成績和期末考試成績。相鄰兩個數之間用乙個空格隔開,三項成績滿分都是...

NOIP2017 寶藏 題解(狀壓DP)

參與考古挖掘的小明得到了乙份藏寶圖,藏寶圖上標出了 nnn 個深埋在地下的寶藏屋,也給出了這 nnn 個寶藏屋之間可供開發的m mm 條道路和它們的長度。小明決心親自前往挖掘所有寶藏屋中的寶藏。但是,每個寶藏屋距離地面都很遠,也就是說,從地面打通一條到某個寶藏屋的道路是很困難的,而開發寶藏屋之間的道...