zoukankan      html  css  js  c++  java
  • BZOJ 2510: 弱题( 矩阵快速幂 )

    每进行一次, 编号为x的数对x, 和(x+1)%N都有贡献

    用矩阵快速幂, O(N3logK). 注意到是循环矩阵, 可以把矩阵乘法的复杂度降到O(N2). 所以总复杂度就是O(N2logK)

    ----------------------------------------------------------------------

    #include<bits/stdc++.h>
     
    using namespace std;
     
    const int maxn = 1009;
     
    int N, M, K, cnt[maxn];
    double ans[maxn], Q[maxn], T[maxn];
     
    void init_Q() {
    memset(Q, 0, sizeof Q);
    Q[0] = 1.0 - double(1) / M;
    Q[N - 1] = double(1) / M;
    }
     
    void MUL(double a[]) {
    memset(T, 0, sizeof T);
    for(int i = 0; i < N; i++)
    for(int j = 0; j < N; j++)
       T[i] += a[j] * Q[(N  + i - j) % N];
    for(int i = 0; i < N; i++)
       a[i] = T[i];
    }
     
    int main() {
    scanf("%d%d%d", &N, &M, &K);
    for(int i = 0; i < N; i++) scanf("%d", cnt + i);
    init_Q();
    ans[0] = 1;
    for(; K; K >>= 1) {
    if(K & 1) MUL(ans);
    MUL(Q);
    }
    for(int i = 0; i < N; i++) {
    double t = 0;
    for(int j = 0; j < N; j++)
       t += double(cnt[j]) * ans[(j - i + N) % N];
    printf("%.3lf ", t);
    }
    return 0;
    }

    ----------------------------------------------------------------------

    2510: 弱题

    Time Limit: 10 Sec  Memory Limit: 128 MB
    Submit: 183  Solved: 84
    [Submit][Status][Discuss]

    Description

    M个球,一开始每个球均有一个初始标号,标号范围为1~N且为整数,标号为i的球有ai个,并保证Σai = M
    每次操作等概率取出一个球(即取出每个球的概率均为1/M),若这个球标号为kk < N),则将它重新标号为k + 1;若这个球标号为N,则将其重标号为1。(取出球后并不将其丢弃)
    现在你需要求出,经过K次这样的操作后,每个标号的球的期望个数。
     

    Input

    第1行包含三个正整数NMK,表示了标号与球的个数以及操作次数。
    第2行包含N非负整数ai,表示初始标号为i的球有ai个。
     

    Output

    应包含N行,第i行为标号为i的球的期望个数,四舍五入保留3位小数。
     

    Sample Input

    2 3 2
    3 0

    Sample Output

    1.667
    1.333

    HINT

    【样例说明】

    第1次操作后,由于标号为2球个数为0,所以必然是一个标号为1的球变为标号为2的球。所以有2个标号为1的球,有1个标号为2的球。

    第2次操作后,有1/3的概率标号为2的球变为标号为1的球(此时标号为1的球有3个),有2/3的概率标号为1的球变为标号为2的球(此时标号为1的球有1个),所以标号为1的球的期望个数为1/3*3+2/3*1 = 5/3。同理可求出标号为2的球期望个数为4/3。

     

    【数据规模与约定】

    对于10%的数据,N ≤ 5, M ≤ 5, K ≤ 10;

    对于20%的数据,N ≤ 20, M ≤ 50, K ≤ 20;

    对于30%的数据,N ≤ 100, M ≤ 100, K ≤ 100;

    对于40%的数据,M ≤ 1000, K ≤ 1000;

    对于100%的数据,N ≤ 1000, M ≤ 100,000,000, K ≤ 2,147,483,647。




    Source

  • 相关阅读:
    hdu 4027 Can you answer these queries? 线段树
    ZOJ1610 Count the Colors 线段树
    poj 2528 Mayor's posters 离散化 线段树
    hdu 1599 find the mincost route floyd求最小环
    POJ 2686 Traveling by Stagecoach 状压DP
    POJ 1990 MooFest 树状数组
    POJ 2955 Brackets 区间DP
    lightoj 1422 Halloween Costumes 区间DP
    模板 有源汇上下界最小流 loj117
    模板 有源汇上下界最大流 loj116
  • 原文地址:https://www.cnblogs.com/JSZX11556/p/4771808.html
Copyright © 2011-2022 走看看