题解:扩展欧几里德,//具体过程待补充
<扩展欧几里德模板>:
void extend_gcd(LL a,LL b,LL &d,LL &x,LL &y)
{
if(b==0)
{
d=a;
x=1,y=0;
}
else
{
extend_gcd(b,a%b,d,y,x);
y-=x*(a/b);
}
}
#include<iostream>
#include<cstdio>
typedef long long LL;
using namespace std;
void extend_gcd(LL a,LL b,LL &d,LL &x,LL &y)
{
if(b==0)
{
d=a;
x=1,y=0;
}
else
{
extend_gcd(b,a%b,d,y,x);
y-=x*(a/b);
}
}
int main()
{
LL x,y,m,n,L;
while(scanf("%I64d%I64d%I64d%I64d%I64d",&x,&y,&m,&n,&L)!=EOF)
{
LL d,xx,yy;
extend_gcd(n-m,L,d,xx,yy);
if((x-y)%d==0)
{
LL p=L/d;
xx=(x-y)/d*xx;
xx=(xx%p+p)%p;
printf("%I64d\n",xx);
}
else printf("Impossible\n");
}
return 0;
}
------------------------------------------------------------------------------------------------------------------
题解:同A,扩展欧几里德。
//还有种方法是用 中国剩余定理+不互质定理 待补充
#include<iostream>
#include<cstdio>
using namespace std;
typedef long long ll;
void extend_gcd(ll a,ll b,ll &d,ll &x,ll &y)
{
if(b==0)
{
d=a;
x=1,y=0;
}
else
{
extend_gcd(b,a%b,d,y,x);
y-=x*(a/b);
}
}
int main()
{
int k;
ll a1,r1,a,r;
while(~scanf("%d",&k))
{
scanf("%I64d%I64d",&a1,&r1);
int flag=1;
for(int i=2;i<=k;i++)
{
scanf("%I64d%I64d",&a,&r);
ll d,x,y;
extend_gcd(a1,a,d,x,y);
if((r-r1)%d!=0)
flag=0;
ll p=a/d;
x=(r-r1)/d*x;
x=(x%p+p)%p;
r1=a1*x+r1;
a1=a1*(a/d);
}
if(flag)
printf("%I64d\n",r1);
else printf("-1\n");
}
return 0;
}
---------------------------------------------------------------------------------------------------------------------------------------------------------
题解:矩阵快速幂,模板见
训练题R2
#include<iostream>
#include<cstdio>
using namespace std;
typedef long long ll;
#define MOD 10000
ll a[7],b[7],a0[7],b0[7];
void pow_mod(ll n)
{
a0[1]=a0[2]=a0[3]=1,a0[4]=0;
b0[1]=b0[4]=1,b0[2]=b0[3]=0;
while(n)
{
if(n%2==1)
{
b[1]=(a0[1]*b0[1]+a0[2]*b0[3])%MOD;
b[2]=(a0[1]*b0[2]+a0[2]*b0[4])%MOD;
b[3]=(a0[3]*b0[1]+a0[4]*b0[3])%MOD;
b[4]=(a0[3]*b0[2]+a0[4]*b0[4])%MOD;
for(int i=1;i<=4;i++) //注意用新变量保存
b0[i]=b[i];
}
a[1]=(a0[1]*a0[1]+a0[2]*a0[3])%MOD;
a[2]=(a0[1]*a0[2]+a0[2]*a0[4])%MOD;
a[3]=(a0[3]*a0[1]+a0[4]*a0[3])%MOD;
a[4]=(a0[3]*a0[2]+a0[4]*a0[4])%MOD;
for(int i=1;i<=4;i++) //注意用新变量保存
a0[i]=a[i];
n/=2;
}
}
int main()
{
ll n;
while(~scanf("%I64d",&n)&&n!=-1)
{
if(n==0) printf("0\n");
else
{
pow_mod(n);
printf("%I64d\n",b[2]);
}
}
return 0;
}
----------------------------------------------------------------------------------------------------------------------------------------------
1.素数筛选;
2.欧拉函数;
3.欧拉定理;
4.逆元;
5.CRT(中国剩余定理);
6.积性函数;
7.FFT,NNT;
8.平方剩余;
9.莫比乌斯反演;
10.不互质定理;
11.组合数学:排列组合,组合游戏(博弈);
12.概率:概率DP,期望DP;