慈溪中學摸底測試

2022-02-28 12:08:25 字數 3287 閱讀 1636

首先咱一開始並沒有看到 q 的資料範圍,並且子任務**裡還有一堆 none (???)

於是整個機房都打算阿了出題人

後來滾回來看的時候 bug 基本都修好了,於是開始撓頭髮(這個資料範圍真是要人命啊 q 居然可以到 2e9 ...)

但後來看到了這個 m 的範圍比較小,於是估計這道題就是利用 m 比較小的性質來做的

於是列一下 \(c_n^m\) 的公式:

\[c_n^m =

\]並沒有什麼軟用...然後用下降冪表示一下:

\[c_n^m =}\over m!}

\]說人話就是:

\[c_n^m =

\]發現上下都只有 \(m\) 項(撓頭)

於是想想如果 mod 為質數怎麼做: 咱可以 \(o(m)\) 得去得到這個公式上面和下面兩個部分的值,然後 \(o(log ~mod)\) 蒙哥馬利一下就可以得到答案了 【汗

然後咱考慮 mod 不是質數的情況,這個時候咱需要對上下兩部分的 m 個數進行質因子分解,這是 \(\sqrt n\) 的複雜度,但咱可以用人類智慧型優化到 \(\sqrt n\over log ~n\) ,具體康**(好吧不就是普通的尤拉篩麼)...

然後咱把上下兩部分的質因子分別加起來,上面的每個質因子 \(p_i\) 的次數 \(k_\) 減去下面質因子的次數 \(k_\) ,然後每個質因子快速冪一下就好了(這個複雜度好像是 $\sqrt n ~loglog ~n $ 級別的 )

但是咱發現太大的質因子存不下呢...那咱就把這些太大的質因子(超過 \(\sqrt n\) 的)用 map 去存就好了(複雜度大概是 \(m ~log ~m\) ...?最後遍歷時候的複雜度也不高(應該...)

然後咱本地測了最大資料... t 飛上天(頓時懵逼

懵逼一會兒之後開始補救,大概就是對於 mod 是質數的情況進行了特判...少了 \(\sqrt n\over log ~n\) 的複雜度...

最後就是一邊自閉一邊把**交上去準備 t 飛了...

【結果最後資料特別友好,真是氣人啊,浪費感情...

// by judge

#pragma gcc optimize("ofast")

#include #define rg register

#define fp(i, a, b) for (rg int i = (a), i = (b) + 1; i < i; ++i)

#define fd(i, a, b) for (rg int i = (a), i = (b)-1; i > i; --i)

#define ll long long

using namespace std;

const int m = 5e4 + 3;

typedef int arr[m];

#ifndef judge

#define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? eof : *p1++)

#endif

char buf[1 << 21], *p1 = buf, *p2 = buf;

inline bool cmax(int& a, int b)

inline bool cmin(int& a, int b)

inline int read()

int n, m, mod, id1[m];

mapid2;

inline int mul(int x, int y)

inline int qpow(int x, int p)

int cnt, p[m], v[m];

inline void prep(int n)

}}inline void add(int x, int v)

if (x > 1)

}#define it map::iterator

inline int solv()

inline bool isprime(int x)

return 1;

}inline void solv0()

int main()

memset(id1, 0, sizeof id1), id2.clear();

fp(i, 1, m) add(n - i + 1, 1), add(i, -1);

printf("%d\n", solv());

}return 0;

}

比賽的時候咱可是放過話的:「網路流這種東西 csp 怎麼可能會考,你見過 noip 考過 wll 麼?他要敢考咱就敢爆零!」 於是咱並沒有黑白染色冷靜一下並且華麗**...

給個亂打的**(沒有交過 因為交不了)

//by judge

#include#define rg register

#define fp(i,a,b) for(rg int i=(a),i=(b)+1;ii;--i)

#define go(u) for(rg int i=head[u],v=e[i].to;i;v=e[i=e[i].nxt].to)

#define open(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)

#define ll long long

using namespace std;

const int m=65;

typedef int arr[m][m];

typedef int arr[m*m];

const int h[5]=,l[5]=;

#ifndef judge

#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?eof:*p1++)

#endif

char buf[1<<21],*p1=buf,*p2=buf;

inline int read() inline int cread() int n,cnt,tim,pat,ans; arr head,used,get; arr a,id;

struct edgee[m*m<<2];

inline void add(int u,int v),head[u]=pat;

}inline int calc(int x,int y)

bool find(int u)

int n, k, a[m], f[m][m];

inline int min(int x, int y)

int main()

題解 慈溪中學 8 12 T3

傳送門 分層dp的思路 d pi j,s dp dp i,j,s 表示做到第i ii層,總共選了j jj個點,第i ii層選了s ss個點的方案數 是由上一層轉移過來的,所以列舉上一層選的點數w ww得到乙個比較複雜的轉移方程 意義是,從這一層開始,總共剩餘 n j s 1 n j s 1 n j ...

題解 慈溪中學 8 13 T3

傳送門 奇妙ac。發現答案最多是2 用相對運動,兩個矩形,乙個靜止,那麼另乙個就是沿著k 1k 1 k 1 的直線運動 然後想到乙個o n 2 o n 2 o n2 的,列舉任意兩個矩形間是否會有重疊部分的情況 然後這個che ck check chec k想了好一會 先是對於每個點,都會有乙個在k...

C connnect 摸底測試

摸底測試c題 給n個點,並且每個點有三個值,x,y,z,連線兩點u,v之間的花費為min xu xv yu yv zu zv 求將n個點連起來的最小花費為多少。其實就是一道最小生成樹的題,用kluscal演算法來做,和普通的最小生成樹的差別在於任意兩點之間有三個距離值,在用kluscal之前要先處理...