题解

15 条题解

  • 1
    @ 2025-06-14 15:52:58
    /* - - - - - - - - - - - - - - -
        User :      VanishD
        problem :   [bzoj1361]
        Points :    
    - - - - - - - - - - - - - - - */
    # include <bits/stdc++.h>
    # define    ll      long long
    # define    inf     0x3f3f3f3f
    # define    M       200010
    # define    N       1010
    using namespace std;
    int read(){
        int tmp = 0, fh = 1; char ch = getchar();
        while (ch < '0' || ch > '9'){ if (ch == '-') fh = -1; ch = getchar(); }
        while (ch >= '0' && ch <= '9'){ tmp = tmp * 10 + ch - '0'; ch = getchar(); }
        return tmp * fh;
    }
    struct INT{
        int len, num[N];
        void print(){
            for (int i = len; i > 0; i--)
                printf("%d", num[i]);
            printf("\n");
        }
    }tnp, f[N], nxt;
    INT operator -(INT &a, INT &b){
        nxt = a; int i;
        for (i = 1; i <= nxt.len; i++) nxt.num[i] -= b.num[i];
        for (i = 1; i < nxt.len; i++)
            if (nxt.num[i] < 0)
                nxt.num[i] += 10, nxt.num[i + 1] -= 1;
        while (nxt.num[nxt.len] == 0)
            nxt.len--;
        return nxt;
    }
    INT operator *(INT &a, int b){
        nxt = a; int i;
        for (i = 1; i <= nxt.len; i++) nxt.num[i] *= b;
        for (i = 1; i <= nxt.len || nxt.num[i] != 0; i++)
            nxt.num[i + 1] += nxt.num[i] / 10, nxt.num[i] %= 10;
        nxt.len = i - 1;
        return nxt;
    }
    INT operator /(INT &a, int b){
        memset(nxt.num, 0, sizeof(nxt.num));
        nxt.len = 0; int i, tmp = 0;
        for (i = a.len; i >= 1; i--){
            tmp = tmp * 10 + a.num[i];
            nxt.num[i] = tmp / b;
            nxt.len = max(nxt.len, (nxt.num[i] > 0) ? i : 0);
            tmp %= b;
        }
        return nxt;
    }
    char mp[M];
    int n, m, k;
    int main(){
    //  freopen("bzoj1361.in", "r", stdin);
    //  freopen("bzoj1361.out", "w", stdout);
        n = read(), m = read(), k = read();
        scanf("\n%s", mp + 1);
        tnp.len = 1, tnp.num[1] = 1;
        for (int i = 1; i <= k; i++){
            tnp = tnp * 2;
            f[i] = tnp;
            for (int j = 1; j < i; j++)
                if (i % j == 0) f[i] = f[i] - f[j];
        }
        f[k] = f[k] / k; 
        f[k].print();
        for (int i = 1; i <= m; i++) mp[i] -= '0';
        for (int i = m + 1; i <= n; i++)
            mp[i] = mp[(i - 1) % m + 1];
        mp[n]++;
        int tmp = n;
        while (mp[tmp] == 2){
            mp[tmp--] = 0;
            mp[tmp]++;
        }
        for (int i = 1; i <= tmp; i++)
            printf("%d", mp[i]);
        printf("\n");
        return 0;
    }
    
  • 0
    @ 2022-01-09 15:50:28

    图片:“老爹炸了!!!”

  • 0
    @ 2017-10-29 10:01:03

    图片爆了。。。。

  • 0
    @ 2009-10-26 19:11:21

    第一问容斥原理+高精可以做

    第二问贪心做,尽量多地复制原串,再加1,最后去掉结尾多余的0.

  • 0
    @ 2009-10-18 14:04:55

    占地盘~图片呢?

  • 0
    @ 2009-10-17 23:10:19

    没图

    - -||

  • 0
    @ 2009-10-15 00:32:33

    哇!!!

    好神奇啊!!!

  • 0
    @ 2009-10-13 18:21:39

    图片看不到耶...#

  • 0
    @ 2009-10-12 14:16:29

    好多楼啊好多楼

  • 0
    @ 2009-10-11 12:37:16

    已经这么多楼了...仰望

  • 0
    @ 2009-10-10 21:28:11

    我要看片。。。。。。占楼

  • 0
    @ 2009-10-10 20:39:44

    图片去哪了

  • 0
    @ 2009-10-10 14:48:30

    wa...

  • 0
    @ 2009-10-10 13:06:06

    我说吖……图片都没有怎么做啊……

  • 0
    @ 2009-10-10 12:40:15

    额,先来占下,这道题还100%阿,不好意思交了

  • 1

信息

ID
1668
难度
4
分类
组合数学 | 高精度 点击显示
标签
递交数
37
已通过
16
通过率
43%
被复制
2
上传者