题意
自己看
题解
我们设一开始的数为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=L
LL x,y;
LL d=exgcd(lalal,n,x,y);
printf("%lld",(x*(l/d)%(n/d)+(n/d))%(n/d));
return 0;
}