【BZOJ】【P3823】【定情信物】【题解】【线性筛逆元】

来源:互联网 发布:淘宝金币抵扣怎么设置 编辑:程序博客网 时间:2024/05/01 03:56

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3823

有点意思的题目

脑子里yy不出来4维的情况……

把前三维打个表

发现0维个数好像是 2^n

然后就是 f[i]=f[i-1]*(n-i+1)/2i 筛逆元算就完了

UPD:数据加强被叉了T_T

原因是p的倍数没有逆元……

所以记录一下当前数中有多少个p就可以了

Code:

#include<bits/stdc++.h>using namespace std;typedef long long LL;LL n,p;LL pw(LL x,LL k){    LL ans=1;    for(;k;k>>=1){        if(k&1)ans=(ans*x)%p;        x=(x*x)%p;    }return ans;}LL f,ans;int inv[int(2e7+5)];int cnt=0;int main(){    cin>>n>>p;    ans=f=pw(2,n);cnt=0;inv[1]=1;    for(int i=2;i<=min(2*n,p-1);i++)inv[i]=(LL)(p-p/i)*inv[p%i]%p;    for(int i=1;i<=n;i++){int tmp=n-i+1;while(tmp%p==0)cnt++,tmp/=p;f=(LL)f*tmp%p;tmp=2*i;while(tmp%p==0)cnt--,tmp/=p;f=(LL)f*inv[tmp%p]%p;        ans^=cnt?0:f;    }cout<<ans<<endl;    return 0;}


0 0
原创粉丝点击