当前位置: 代码迷 >> 综合 >> bzoj1965: [Ahoi2005]SHUFFLE 洗牌
  详细解决方案

bzoj1965: [Ahoi2005]SHUFFLE 洗牌

热度:105   发布时间:2023-10-29 11:06:02.0

题意

自己看

题解

我们设一开始的数为X
我们可以发现变化规则为:
X=2*X X<=(n/2)
X=2*X-(n+1) X>n/2
于是这个其实可以总结为X=2*X % (n+1)
于是就可以做了
就相当于X*2m-(n+1)*Y=l
这样就可以用扩展欧几里得做了

#include<cstdio>
typedef long long LL;
LL n,m,l;
LL get (LL x,LL y)
{if (y==0) return 1;if (y==1) return x;LL lalal=get(x,y/2);lalal=lalal*lalal%n;if (y%2!=0) lalal=lalal*x%n;return lalal;
}
LL exgcd (LL a,LL b,LL &x,LL &y)
{if (a==0){x=0;y=1;return b;}LL tx,ty;LL d=exgcd(b%a,a,tx,ty);x=ty-(b/a)*tx;y=tx;return d;
}
int main()
{scanf("%lld%lld%lld",&n,&m,&l);n++;LL lalal=get(2,m);//X*lalal-n*Y=LLL x,y;LL d=exgcd(lalal,n,x,y);printf("%lld",(x*(l/d)%(n/d)+(n/d))%(n/d));return 0;
}
  相关解决方案