题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1965
分析:发现x[i]=(2*X[i-1])%(n+1),即L=x*2^m mod(n+1),2^m由快速幂算得,则问题转化为求同余方程2^m*x+(n+1)y=L的解,可由括展欧几里得算的2^m*x+(n+1)y=gcd(2^m,n+1)的解,然后乘以L/gcd(2^m,n+1),最后别忘了mod(n+1)
代码:
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <iostream>
using namespace std;
long long int n,m,l,ans=1,t;
void quick()
{
long long int tmp=2;
while(m>0)
{
if(m&1) ans=(ans*tmp)%(n+1);
m>>=1;
tmp=(tmp*tmp)%(n+1);
}
return;
}
long long exgcd(long long a,long long b,long long &x,long long &y)
{
if(b==0)
{
x=1;
y=0;
return a;
}
long long g=exgcd(b,a%b,x,y);
t=x;
x=y;
y=t-(a/b)*y;
return g;
}
int main()
{
long long int x,y,g;
cin>>n>>m>>l;
quick();
g=exgcd(ans,n+1,x,y);
x=(x*l/g)%(n+1);
while(x<0) x+=n+1;
cout<<x;
return 0;
}