zoukankan      html  css  js  c++  java
  • bzoj 3823: 定情信物 线性筛逆元

    3823: 定情信物

    Time Limit: 10 Sec  Memory Limit: 128 MB
    Submit: 108  Solved: 2
    [Submit][Status]

    Description

    都说程序员找不到妹子,可是无人知晓,三生石上竟然还刻着属于小 E 的一笔。

    那一天,小 E 穷尽毕生的积蓄,赠与了妹子一个非同寻常的定情信物。那是一个小

    小的正方体,但透过它,可以看到过去,可以洞彻天机。

    这份信物仿佛一只深邃的眼。当看透它看似简单的外表后,深邃的内心却最是可以

    叩击人的灵魂的。不出所料,妹子果然被这个信物超越空间的美所吸引。

    “易有太极,是生两仪,两仪生四象,四象生八卦。,八卦定吉凶,吉凶生大业。”

    这句箴言在其上得到了完美的诠释。

    是的,这正是一个超正方体。

    小 E 告诉妹子,他的情意也如这份信物一样深厚。现在妹子想知道,小 E 对她的情

    意究竟有几分?

    我们知道,点动成线,线动成面,面动成体......即 n 维超立方体可看作由 n-1 维超

    立方体沿垂直于它的所有的棱的方向平移得到的立体图形。

    我们可以将点看作 0 维超立方体,将直线看作 1 维超立方体,将正方形看作 2 维超

    立方体......依此类推。

    任何一个 n 维超立方体(n>0)都是由低维的超立方体元素组成的:它的 n-1 维表面

    是 n-1 维的超立方体,它的 n-2 维边缘是 n-2 维的超立方体,它的 n-3 维元素是 n-3 维的

    超立方体......

    小 E 对妹子的情意即为在他的定情信物——K 维超立方体中,含有每一维的元素个

    数。由于元素个数可能较大,只需要输出它所包含的每一维元素个数模 P 后的异或和。

    Input

    两个整数 K、P,详见题目叙述。

    Output

    一个非负整数,表示小 E 的定情信物所包含的每一维元素个数模 P 后的异或和。注

    意:异或和可能会大于 P。

    Sample Input

    input 1
    3 7

    Input 2

    4 2333

    Input 3

    12 7723

    Sample Output

    Output1

    3

    Output 2

    33

    Output 3

    360

    Hint
    对于样例2的解释:
    一个三维超立方体含有 8 个零维元素、12 个一维元素、6 个二维元素、1 个三维

    元素,模 7 后分别为 1,5,6,1,异或和为 1^5^6^1=3。

    HINT

    对于 100%的数据,N≤10^7,P 为 10^9 内的素数。
     
    网上题解1mol多,基本没什么可以过5 3这组数据的。。。。
    对于n维的情况,我们可以考虑k维元素的“向量”是由在n维的n个方向任选k个完全定义的,同样的向量有2^(n-i)个,所以是C(n,i)*2^i,yy一下求逆元的方法就行了。
     
    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    #define MAXN 11000000
    typedef long long qword;
    int inv[MAXN];
    int prime[1100000],topp=-1;
    bool pflag[MAXN];
    qword n,p;
    qword pow_mod(qword x,qword y)
    {
            qword ret=1;
            while (y)
            {
                    if (y&1)ret=ret*x%p;
                    x=x*x%p;
                    y>>=1;
            }
            return ret;
    }
    void init()
    {
            inv[1]=1;
            for (int i=2;i<=n;i++)
            {
                    if (!pflag[i])
                    {
                            prime[++topp]=i;
                            inv[i]=pow_mod(i,p-2);
                    }
                    for (int j=0;j<=topp && (qword)i*prime[j]<MAXN;j++)
                    {
                            pflag[i*prime[j]]=true;
                            inv[i*prime[j]]=(qword)inv[i]*inv[prime[j]]%p;
                            if (i%prime[j]==0)break;
                    }
            }
    }
    int main()
    {
            freopen("input.txt","r",stdin);
            scanf("%lld%lld",&n,&p);
            qword x,y,z;
            int i,j,k;
            qword ans=0;
            init();
            x=1;y=1;
            ans^=x*y%p;
            int totp=0;
            for (i=1;i<=n;i++)
            {
                    x=x*2%p;
                    z=n-i+1;
                    while (z%p==0)totp++,z/=p;
                    y=y*z%p;
                    z=i;
                    while (z%p==0)totp--,z/=p;
                    y=y*inv[z%p]%p;
                    ans^=totp?0:x*y%p;
            }
            printf("%lld
    ",ans);
    }
    by mhy12345(http://www.cnblogs.com/mhy12345/) 未经允许请勿转载

    本博客已停用,新博客地址:http://mhy12345.xyz

  • 相关阅读:
    Java ClassLoader
    Java Hashcode
    Java 装箱 拆箱
    Java 深拷贝,浅拷贝
    Java IO流
    JVM内存模型
    C语言中的__FILE__、__LINE__和#line
    OpenMP和MPI的区别
    visual studio代码备份精减
    MVVM设计模式在WPF中的应用
  • 原文地址:https://www.cnblogs.com/mhy12345/p/4191910.html
Copyright © 2011-2022 走看看