您的位置:首页 > 其它

【BZOJ】【P1965】【AHOI2005】【SHUFFLE 洗牌】【题解】【数论】

2014-05-02 12:33 441 查看
传送门:

http://www.lydsy.com/JudgeOnline/problem.php?id=1965

开始以为是群论……YY了好久怎样找轮换……

后来发现是数论……

x* 2^m=l (mod n+1)

解x

快速幂+扩欧0ms秒杀……

Code:

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long lld;
lld n,m,l;
lld exgcd(lld a,lld b,lld &x,lld &y){
if(!b){
x=1;y=0;
return a;
}else{
lld g=exgcd(b,a%b,x,y);
lld t=x;
x=y;
y=t-a/b*y;
return g;
}
}
lld gcd(lld a,lld b){
while(b){
lld t=a;
a=b;
b=t%b;
}
return a;
}
lld power(lld x,lld k){
lld ans=1;
for(;k;k>>=1){
if(k&1)ans*=x;
x*=x;
if(x>n)x%=(n+1);
if(ans>n)ans%=(n+1);
}
return ans;
}
int main(){
cin>>n>>m>>l;
m=power(2,m);
//x*m=l(mod n+1)
//mx + (n+1) y =l
//m'x+(n+1)' y=l'
lld x,y;
n=n+1;
lld d=gcd(m,n);
m/=d;n/=d;l/=d;
exgcd(m,n,x,y);
x=x*l%n;
while(x<0)x+=n;
cout<<x<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  省选 bzoj