zoukankan      html  css  js  c++  java
  • HDU 1153 magic bitstrings(读题+)

     hdu 1153 magic bitstrings

    题目大意

        一个质数p,现在让你求一个p-1长度的“01魔法串”。关于这个魔法串是这么定义的: 
        我们现在把这个串经过一段处理变成一个长宽均为p-1的矩阵,对于第i行的串,是由原来的串按每i位取得的。如果这个矩阵每行的串满足:和原来的串相等或是原来的串按位取反,我们就称这个串是魔法串。(说了一大堆如果还没看懂就去问题底下的Discuss看吧….)


    题解

        一开始热衷于讨论第一行和最后一行的关系…结果什么也没看出来…后来看了别人的题解,才发现自己有多蠢。 
        我们把前两行先写出来:

    Column1Column2Columnp1
    a1.mod.p a2.mod.p ap1
    a2.mod.p a4.mod.p a[2(p1)].mod.p

        我们可以看到,讨论表格前两列的话 a1.mod. a2.mod.如果相等,那么 a2.mod. a4.mod.一定也相等,所以我们得到 a1.mod. a4.mod.相等;而如果 a1.mod. a2.mod.不相等的话,我们同样推出 a1.mod. a4.mod.相等,所以 a1.mod. a4.mod.一定是相等的。 
        同理可以得到 a1.mod. a9.mod.相等、 a1.mod. a16.mod.相等…..所以我们得出一个结论: ai2.mod.都是相等的,其余各项也都是相等的。 
        为了字典序最小,我们把所有 ai2.mod.置为0,其余各项置为1,除了2以外,对于所有的质数都是有解的。

     

     

    把矩阵列出来

    a[1%n], a[2%n], a[3%n], ..., a[n-1]                  (1)

    a[2%n], a[4%n], a[6%n], ..., a[2(n-1)%n]       (2)

    a[3%n], a[6%n], a[9%n], ..., a[3(n-1)%n]       (3)

    ...

    比较 (1), (2)

    发现:

    如果 a[1%n] != a[2%n],那么 a[2%n] != a[4%n],那么 a[1%n] == a[4%n];

    如果 a[1%n] == a[2%n],那么 a[2%n] == a[4%n],那么 a[1%n] == a[4%n]。

    所以 a[1%n] == a[4%n]

    同样的方法得到:

    a[1%n] == a[9%n],

    a[1%n] == a[16%n],

    ....

    所有下标是 i 平方 mod n 都相等。

    下标不是 i 平方 mod n 都相等。

    为了字典顺序最小,并且避免整个数列都是同一个数(题目要求 non-constant),令 a[1%n] = a[4%n] = a[9%n] = ... = 0,其他数都是 1,这样符合题意。

    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #define LL long long
    
    using namespace std;
    
    LL p;
    bool flag[1000005];
    
    int main()
    {
        while(scanf("%I64d",&p),p!=0)
        {
            memset(flag,0,sizeof(flag));
            if (p==2)
            {
                printf("Impossible
    ");
                continue;
            }
            for (LL i=1;i<p;i++) flag[(i*i)%p]=1;
            for (int i=1;i<p;i++) printf("%d",!flag[i]);
            printf("
    ");
        }
        return 0;
    }
    #include <iostream>
    #include <iterator>
    #include <algorithm>
    #include <vector>
    
    int main () {
        long long p;
        while ((std::cin >> p) && p) {
            if (p == 2) {
                std::cout << "Impossible
    ";
                continue;
            }
            std::vector <int> v (p, 1);
            for (long long i=1; i<p; ++i) {
                v [i * i % p] = 0;
            }
            std::copy (v.begin() + 1, v.end(), std::ostream_iterator <int> (std::cout));
            std::cout << "
    ";
        }
        return 0;
    }
  • 相关阅读:
    一行代码更改博客园皮肤
    fatal: refusing to merge unrelated histories
    使用 netcat 传输大文件
    linux 命令后台运行
    .net core 使用 Nlog 配置文件
    .net core 使用 Nlog 集成 exceptionless 配置文件
    Mysql不同字符串格式的连表查询
    Mongodb between 时间范围
    VS Code 使用 Debugger for Chrome 调试vue
    css权重说明
  • 原文地址:https://www.cnblogs.com/kimsimple/p/6714447.html
Copyright © 2011-2022 走看看