我是辣鸡

一、扩展欧几里得

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 );
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值