泛刷水題記17.12.27
阿新 • • 發佈:2019-01-27
SHOI的題目質量好高啊,感覺都是些不錯的題目……(
我都不會做)
LOJ 2142「SHOI2017」相逢是問候
題意:給定一個序列,在模
分析:一看到模意義,我們馬上想到指數迴圈節,由於
我們會發現,這個定理大致意思就是說,找另一個
那麼進一步的,再套幾層下去,就會相當於模
很明顯
然後和區間取模就很類似了,利用線段樹維護暴力修改和區間求和,每次暴力修改,如果發現不用修改了(對原來指數的模已經相當於模
直接做是
LOJ 2143「SHOI2017」組合數問題
題意:從
分析:容易看出,如果我們設一個
但是還有更快的做法,就是考慮到 i+j=tf(n,i)×f(n,j)
就是列舉前一段和後一段選的個數,時間複雜度
# include <cstdio>
# include <cstring>
# define mem(x,v) memset(x,v,sizeof(x))
# define N 1000000000
# define K 50
typedef long long LL;
LL p;
int k;
struct MVec {
LL a[K * 2];
MVec(bool u = false) : a() {
if (u) a[0] = 1;
}
LL &operator [](int i) { return a[i]; }
const LL &operator[](int i) const { return a[i]; }
};
inline MVec &operator%=(MVec &a, int k) {
for (int i = k; i < k * 2; i++) {
(a[i - k] += a[i]) %= p;
a[i] = 0;
}
return a;
}
inline MVec operator*(const MVec &a, const MVec &b) {
MVec res;
for (int i = 0; i < k; i++) {
for (int j = 0; j < k; j++) {
(res[i + j] += a[i] * b[j] % p) %= p;
}
}
res %= k;
return res;
}
inline MVec pow(MVec a, LL n) {
MVec res(true);
for (; n; n >>= 1, a = a * a) if (n & 1) res = res * a;
return res;
}
int main() {
int n, r;
scanf("%d%lld%d%d", &n, &p, &k, &r);
MVec a;
a[1] = 1;
a[0] = 1;
a %= k;
MVec res = pow(a, (LL)n * k);
printf("%lld\n", res[r]);
}
LOJ 2190「SHOI2014」訊號增幅儀
題意:平面上給一些點,問最小橢圓覆蓋,其中橢圓長軸和短軸的比是給出的一個
分析:這裡轉化的思路還是很茲瓷的……畢竟我們還是會最小圓覆蓋的
考慮將整個圖轉到長軸的方向上,然後將整個圖短軸方向上擴大
最小圓覆蓋用隨機增量法很好寫……所以是期望
LOJ 2039「SHOI2015」鐳射發生器
題意:給一條射線,每次碰到一條線段
分析:這是一道暴力題……直接暴力判斷肯定不會超,而且資料範圍其實可以往上放得多很多的qaq