一、扩展欧几里得
1、bzoj1477
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
long long x, y, m, n, L;
void exgcd ( long long a, long long b, long long &d, long long &x, long long &y ) {
if ( b == 0 ) {
d = a; x = 1; y = 0;
} else {
long long x0, y0;
exgcd ( b, a % b, d, x0, y0 );
x = y0;
y = x0 - (a/b) * y0;
}
}
void init ( ) {
long long k, d, p;
long long dog = m-n, doge = y-x;//一开始移项错了写成x-y:)
exgcd ( dog, L, d, k, p );
if ( doge % d ) {
printf ( "Impossible" );
exit ( 0 );
}
k = ( ( k * (doge/d) % L ) + L ) % L;
printf ( "%lld", k );
}
int main ( ) {
scanf ( "%lld%lld%lld%lld%lld", &x, &y, &m, &n, &L );
init ( );
}
二、快速幂
1、bzoj2751
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int mod = 1e9+7;
#define ll long long
struct node {
ll a, b;
}T[100055];
ll mi ( ll a, ll b ) {
ll ans = 1;
for ( ; b; b >>= 1, a = a*a%mod )
if ( b & 1 ) ans = ans*a%mod;
return ans;
}
bool cmp ( node a, node b ) {
if ( a.a != b.a)
return a.a < b.a;
return a.b < b.b;
}
int main ( ) {
ll n, m, k;
scanf ( "%lld%lld%lld", &n, &m, &k );
ll sum = (1+n)*n/2%mod;
for ( int i = 1; i <= k; i ++ )
scanf ( "%lld%lld", &T[i].a, &T[i].b );
sort ( T+1, T+1+k, cmp );
ll ans = 1;
int t = m;
ll tt = sum;
for ( int i = 1; i <= k; i ++ ) {
if ( T[i].a != T[i-1].a ) {
t --;
if ( i != 1 )
ans = ans*tt%mod;
tt = sum-T[i].b;
if ( tt < 0 ) tt += mod;//不加这一步就wa了
}
else if ( T[i].b != T[i-1].b ) {
tt -= T[i].b;
if ( tt < 0 ) tt += mod;
}
if ( i == k ) {
ans = ans*tt%mod;
}
}
/*for(int i=1;i<=k;i++)
{
if(T[i].a!=T[i-1].a&&i!=1)
ans=ans*tt%mod,tt=sum,t--;
if(T[i].a!=T[i-1].a||T[i].b!=T[i-1].b)
{
tt-=T[i].b;
if(tt<0)tt+=mod;
}
}
t--;ans=ans*tt%mod;*///hzwer大神的器官移植
printf ( "%lld", ans * mi(sum, t) % mod );
}