扩展gcd
博客连接:https://blog.csdn.net/u012469987/article/details/39041797
ll exgcd(ll a, ll b, ll &x, ll &y)
{
if(b == 0)
{
x = 1;
y = 0;
return a;
}
ll d = exgcd(b, a % b, x, y);
ll t = x;
x = y;
y = t - (a / b) * y;
return d;
}
二分求等比数列前n项和
ll lsosum(ll q,ll n)
{
if(n==0) return 1;
if(n&1) return lsosum(q,n/2)*(1+fast_power(q,n/2+1))%mod;
else return (lsosum(q,n/2-1)*(1+fast_power(q,n/2+1))+fast_power(q,n/2))%mod;
}
中国剩余定理
LL ai[maxn],mi[maxn];
//互质
LL CRT()
{
int ans=0;
int lcm=1;
int x,y;
for(int i=0;i<n;i++)
lcm*=m[i];
for(int i=0;i<n;i++)
{
int k=lcm/m[i];
exgcd(k,m[i],x,y);
x=(x%m[i]+m[i])%m[i];
ans=(ans+k*a[i]*x)%lcm;
}
return (ans+lcm)%lcm;
}
//不互质LL ch()
{
LL dm,a,b,x,y;
LL c,c1,c2;
a=mi[0];
c1=ai[0];
for(int i=1;i<n;i++)
{
b=mi[i];
c2=ai[i];
LL d=exgcd(a,b,x,y);
c=c2-c1;
if(c%d)return -1;
dm=b/d;
x=((x*(c/d))%dm+dm)%dm;
c1=a*x+c1;
a=a*dm;
}
if(c1==0)
{
c1=1;
for(int i=0;i<n;i++)
c1=c1*mi[i]/gcd(c1,mi[i]);
}
return c1;
}