2019/11/8 CSP模拟

T1 药品实验

内网#4803
由概率定义,有\[a + b + c = 0\]
变形得到\[1 - b = a + c\]
根据题意有\[p_i = a p _{i - 1} + b p_i + c p_{i + 1}\]
\[\therefore (1 - b) p_i = a p_{i - 1} + c p_{i + 1}\]
\[\therefore (a + c) p_i = a p_{i - 1} + c p_{i + 1}\]
\[ a(p_i - p_{i - 1}) = c(p_{i + 1} - p_i) \]
仔细观察一下发现这对于任何\(i\)都适用,也就是说\(p\)序列的差分序列有一些优秀的性质
\(d\)\(p\)的差分序列,\(k\)\(d\)的公比即\(\frac{a}{c}\),那么有\[a* d_i = c * d_{i + 1}\]
\[\frac{d_{i + 1}}{d_i} = \frac{a}{c}\]
\(d\)是一个等比数列,求\(p_n\)即求\(\sum\limits_{i = 1}^n d_i\),由等比数列求和公式得到
\[p_{2n} = d_1 * \frac{(k^n - 1)(k^n + 1)}{k - 1} = 1\]
\[p_n = d_1 * \frac{1}{k^n + 1} = p_{2n} * \frac{1}{k^n + 1} = \frac{1}{k^n + 1}\]
\(O(log(n))\)求快速幂即可

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int mod = (int)1e9 + 7;
ll n, alpha, beta, a, c, ans;
ll qpow(ll a, ll b) {ll ans = 1; for (; b; b >>= 1) {if (b&1) ans = (a * ans) % mod; a = (a * a) % mod;} return ans % mod;}
int main() {
    cin >> n >> alpha >> beta;
    a = ((1 - alpha) * beta) % mod, c = alpha * (1 - beta) % mod;
    ans = qpow(c, mod - 2) * a % mod; ans = qpow(ans, n) % mod + 1; ans = qpow(ans, mod - 2) % mod;
    printf("%lld", ans);
    return 0;
}

T2 小猫钓鱼

内网#4804
被自己sb到了,\(s\)没跟着离散化 \(100pts -> 10pts\)

#include<bits/stdc++.h>
#define N (100000 + 10)
using namespace std;
inline int read(){
    int cnt = 0, f = 1; char c = getchar();
    while (!isdigit(c)) {if (c == '-') f = -f; c = getchar();}
    while (isdigit(c)) {cnt = (cnt << 3) + (cnt << 1) + (c ^ 48); c = getchar();}
    return cnt * f;
}
int T, n, m, s, l, a[N], b[N], cnt, tot, inq[N], kil[N], r;
deque <int> q[205], q2, t;
void pre_work() {
    sort (b + 1, b + cnt + 1);
    int q = unique(b + 1, b + cnt + 1) - b - 1;
    for (register int i = 1; i <= cnt; ++i) a[i] = lower_bound(b + 1, b + q + 1, a[i]) - b;
    s = lower_bound(b + 1, b + q + 1, s) - b;
}
int main() {
//  freopen("fishing.in", "r", stdin);
//  freopen("fishing.out", "w", stdout);
    while (1) {
        n = read(), m = read(), l = read(), s = read(), T = read();
        tot = n; cnt = 0; r = 0;
        if (n == -1) break;
        memset(inq, 0, sizeof inq);
        for (register int i = 1; i <= n; ++i) while (q[i].size()) q[i].pop_back();
        while (q2.size()) q2.pop_back();
        while (t.size()) t.pop_back();
        for (register int i = 1; i <= n; ++i) 
            for (register int j = 1; j <= l; ++j) a[++cnt] = b[cnt] = read();
        a[++cnt] = b[cnt] = s;
        pre_work();
        for (register int i = 1; i <= n; ++i) 
            for (register int j = 1; j <= l; ++j) q[i].push_back(a[(i - 1) * l + j]);
        while (T-- && tot > 1) {  //every round
            ++r;
            for (register int i = 1; i <= n; ++i) { // every person
                if (q[i].empty()) continue;
                int cur = q[i].front(); q[i].pop_front();
                q2.push_back(cur); ++inq[cur];
                if (cur == s && q2.size() > 1) { // if cur is J
                    while (!q2.empty()) t.push_back(q2.back()), --inq[q2.back()], q2.pop_back();
                    while (!t.empty()) q[i].push_back(t.back()), t.pop_back();
                }
                if (inq[cur] > 1 && cur != s && q2.size() > 1) {
                    while (inq[cur] && q2.size())   //pop from back
                        t.push_back(q2.back()), --inq[q2.back()], q2.pop_back();
                    while (!t.empty()) q[i].push_back(t.back()), t.pop_back();
                }
                if (q[i].empty()) --tot, kil[i] = r;
            }
        }
        for (register int i = 1; i <= n; ++i) printf("%d ", q[i].size() ? q[i].size() : -kil[i]);
        puts("");
        for (register int i = 1; i <= n; ++i) {
            while (q[i].size()) {printf("%d ", b[q[i].front()]); q[i].pop_front();}
            puts("");
        }
    }
    return 0;
}

T3

太毒瘤了所以咕了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值