題目描述:給出輸入和暴力程式,求輸出。共10個測試點。
測試點1:
輸入\(a,b,c\),求\(a\times b \ \mathrm \ c\)
\(a,b,c\)屬於long long
範圍。
使用龜速乘或者快速乘。
#include#define rint register int
using namespace std;
typedef long long ll;
ll a, b, mod;
inline void upd(ll &a, ll b)
inline ll mul(ll a, ll b)
return res;
}int main()
}
測試點2:發現它就是個線性遞推,暴力矩陣快速冪即可。
#include#define rint register int
#define int unsigned
using namespace std;
typedef long long ll;
const int n = 3;
ll n;
int mod;
inline void upd(int &a, int b)
inline int add(int a, int b)
inline int sub(int a, int b)
struct matrix
inline matrix operator * (const matrix &o) const
} a, b, c;
inline matrix kasumi(matrix a, ll n)
return res;
}signed main()
}
測試點3:
輸入\(n=10^\),求\(\sum_^ni^k \ \mathrm \ 2^(k=0,1,2,3,4)\)
\[\begin
\sum_^ni^0&=n \\
\sum_^ni^1&=\frac \\
\sum_^ni^2&=\frac \\
\sum_^ni^3&=(\frac)^2 \\
\sum_^ni^4&=\frac
\end
\]首先用__int128
求出\(\frac\),然後求出\(\frac\)和\(\frac\),直接計算。
#include#define rint register int
using namespace std;
typedef unsigned long long ll;
typedef __int128 lll;
ll n, m;
inline ll kasumi(ll a, ll b)
return res;
}ll inv3 = kasumi(3, (1ull << 63) - 1);
ll inv15 = kasumi(15, (1ull << 63) - 1);
int main()
測試點4:
輸入\(n\times m\)的隨機01矩陣,有兩個問題:
求\(1\)的個數\(ans\),輸出\(\frac\)
對於每個\(1\),求離它最近的\(0\)的距離之和(曼哈頓距離)
\(1\le n,m\le 1000\)
看上面的粗體字。
#include const int n = 5000, inf = 0x3f3f3f3f;
int n, m, type;
bool data[n + 11][n + 11];
int seed;
int next_rand()
void generate_input()
long long count1()
int abs_int(int x)
inline int max(int a, int b)
long long count2()
if(flag)
}return ans;
}int main()
return 0;
}
測試點5:
輸入\(n\times m\)的隨機01矩陣,求有多少個全1子矩陣。
\(1\le n,m\le 5000\)
是不是覺得很熟悉?
#include#define rint register int
using namespace std;
typedef long long ll;
const int n = 5003;
int seed;
int next_rand()
int n, a[n][n], pre[n][n], stk[n], top;
ll ans1;
int main()
stk[++ top] = j;
ans1 += ans;
} }printf("%lld\n", ans1);
}}
測試點6:
輸入\(n,a,b,c\),設\(f_0=0,f_n=(af_^2+b) \ \mathrm \ 2^ \ \mathrm \ c\),求\(f_n\)
\(n,a,b,c\)在long long
範圍內。
直接講做法了:首先從\(s\)出發,然後設兩個指標\(x,y\),乙個快指標和乙個慢指標,快指標每次走\(2\)步,慢指標每次走\(1\)步,然後它們在\(m\)點相遇。
計算環長:令其中乙個指標一直走,記錄步數。
計算環起點:令其中乙個指標在\(m\),另乙個在\(s\),然後以同樣的速度走。
然而如果你跑這東西的話會耗死你。【我都寫完上面的東西了它乙個資料點都沒跑出來】
需要用乙個brent判環演算法。這東西的過程是這樣的。
讓\(x\)一直跑,遇到\(y\)的時候退出,\(cnt\)環長。
否則讓\(step=step\times 2,y=x,cnt=0\)
知道環長之後,令\(x=y=0\),然後讓\(x\)跑\(cnt\)遍,然後再讓\(x,y\)一起跑,相遇的地方就是環起點。
然後從環起點開始跑就可以了。
#include#define rint register int
using namespace std;
typedef unsigned long long ll;
const ll n = 1e10;
ll n, a, b, c;
inline ll nxt(ll x)
int main()
} x = y = 0;
while(cnt < s) x = nxt(x), ++ cnt;
cnt = 1;
while(x != y) x = nxt(x), y = nxt(y), ++ cnt;
r = (n - cnt) % s + 1;
while(r --) x = nxt(x);
printf("%llu\n", x);
}}
測試點7:
\(16*16\)的數獨。
是不是覺得很熟悉?
#include#include#define rint register int
using namespace std;
const int n = 1000003, n = 4096, m = 1024;
int a[17][17], r[n], u[n], l[n], d[n], s[n], col[n], row[n], h[n], ans[n], cnt;
inline void init()
l[0] = m; r[m] = 0;
memset(h, -1, sizeof h);
memset(s, 0, sizeof s);
memset(col, 0, sizeof col);
memset(row, 0, sizeof row);
memset(ans, 0, sizeof ans);
cnt = m + 1;
}inline void insert(int x, int y)
++ cnt;
}inline void remove(int y)
}inline void resume(int y)
r[l[y]] = l[r[y]] = y;
}inline bool dance(int dep)
return true;
} int c = r[0];
for(rint i = r[0];i;i = r[i]) if(s[i] < s[c]) c = i;
remove(c);
for(rint i = d[c];i != c;i = d[i])
resume(c);
return false;
}int main()
}dance(0);
for(rint l = 0;l < k;l ++)
}}
測試點8,9,10:咕 uoj 58 WC2013 糖果公園
寒假裡lbn大爺講離線演算法時就講過了。然而現在才明白該怎麼做。這題就是樹上帶修莫隊,帶修莫隊就是再加一維時間,然後分塊size n 2 3 時間複雜度o n 1.67 樹上莫隊可以先求出括號序列,若x為y祖先,則兩點間的路徑為l x l y 否則就是r x l y lca。沒了。include i...
UOJ 349 WC2018 即時戰略
題目鏈結 一開始已知一號點。每次可以選定乙個已知點和乙個未知點,然後互動庫會返回從已知點出發到達未知點路徑上的第二個點。要求在有限步之內知道每乙個點。次數要求 鏈的情況要求 o n o n o n 其餘是 o n logn o nlogn o nlog n 首先是鏈的情況,記錄當前左右端點不斷往後探...
UOJ 348 WC2018 州區劃分
第一次知道子集卷積可以自己卷自己。這是一道子集卷積模板題。設 sum s 表示點集 s 的點權和。設 f s 表示對點集 s 進行州區劃分得到的答案,定義 g s 在點集 s 合法時為 sum s p 不合法時為 0 則 f s frac sum f t g s t 這東西是個子集卷積的形式。但是在...