20160124集训Day3-数学

来源:互联网 发布:淘宝id号是什么 编辑:程序博客网 时间:2024/05/01 13:53

A - 青蛙的约会 题目链接


题解:扩展欧几里德,//具体过程待补充


<扩展欧几里德模板>:

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;}

------------------------------------------------------------------------------------------------------------------

B - Strange Way to Express Integers 题目链接


题解:同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;}

---------------------------------------------------------------------------------------------------------------------------------------------------------

C - Fibonacci 题目链接

题解:矩阵快速幂,模板见训练题R2 

#include<iostream>#include<cstdio>using namespace std;typedef long long ll;#define MOD 10000ll 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;
0 0