【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;
}
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 1965: [Ahoi2005]SHUFFLE 洗牌( 数论 )
- BZOJ 1965 AHOI2005 SHUFFLE 洗牌 数论
- bzoj 1965: [Ahoi2005]SHUFFLE 洗牌
- BZOJ 1965: [Ahoi2005]SHUFFLE 洗牌 快速幂 快速乘
- bzoj 1965: [Ahoi2005]SHUFFLE 洗牌
- bzoj 1965: [Ahoi2005]SHUFFLE 洗牌
- 1965: [Ahoi2005]SHUFFLE 洗牌 - BZOJ
- 【bzoj1956】【Ahoi2005】【SHUFFLE 洗牌】【快速幂】
- 【bzoj1965】 [Ahoi2005]SHUFFLE 洗牌 欧拉定理
- bzoj1965 [Ahoi2005]SHUFFLE 洗牌
- bzoj 1965: [Ahoi2005]SHUFFLE 洗牌 (快速幂)
- BZOJ1965 [Ahoi2005]SHUFFLE 洗牌
- 【bzoj1965】[Ahoi2005]SHUFFLE 洗牌
- [BZOJ]1965: [Ahoi2005]SHUFFLE 洗牌 扩展欧几里得
- BZOJ1965: [Ahoi2005]SHUFFLE 洗牌
- bzoj1965 [Ahoi2005]SHUFFLE 洗牌
- [BZOJ1965][Ahoi2005]SHUFFLE 洗牌(数学相关)
- BZOJ1965: [Ahoi2005]SHUFFLE 洗牌
- 【逆元】【bzoj 1965】: [Ahoi2005]SHUFFLE 洗牌
- BZOJ1965 [Ahoi2005]SHUFFLE 洗牌