浏览器标题切换
浏览器标题切换end
把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end

BZOJ5131: [CodePlus2017年12月]可做题2

BZOJ没有题面,差评

洛谷的题目链接

题解

其实这题很久之前就写了,也想写个题解但是太懒了,咕到了今天

在typora写完题解不想copy过来再改格式了,于是直接贴截图qwq

#include <bits/stdc++.h>

#define ll long long
#define inf 0x3f3f3f3f
#define il inline
#define int long long

namespace io {

    #define in(a) a=read()
    #define out(a) write(a)
    #define outn(a) out(a),putchar('\n')

    #define I_int int
    inline I_int read() {
        I_int x = 0 , f = 1 ; char c = getchar() ;
        while( c < '0' || c > '9' ) { if( c == '-' ) f = -1 ; c = getchar() ; }
        while( c >= '0' && c <= '9' ) { x = x * 10 + c - '0' ; c = getchar() ; }
        return x * f ;
    }
    char F[ 200 ] ;
    inline void write( I_int x ) {
        if( x == 0 ) { putchar( '0' ) ; return ; }
        I_int tmp = x > 0 ? x : -x ;
        if( x < 0 ) putchar( '-' ) ;
        int cnt = 0 ;
        while( tmp > 0 ) {
            F[ cnt ++ ] = tmp % 10 + '0' ;
            tmp /= 10 ;
        }
        while( cnt > 0 ) putchar( F[ -- cnt ] ) ;
    }
    #undef I_int

}
using namespace io ;

using namespace std ;

#define N 100010

int a1 , l , r , k , p , m ;
struct matrix {
    int m[2][2] ;
    matrix() { memset(m,0,sizeof(m)); }
    matrix operator * (const matrix &x) {
        matrix ans;
        for(int i = 0 ; i < 2 ; i ++) {
            for(int j = 0 ; j < 2 ; j ++) {
                for(int k = 0 ; k < 2 ; k ++) {
                    ans.m[i][j] = (ans.m[i][j] + m[i][k] * x.m[k][j]) % p ;
                }
            }
        }
        return ans ;
    }
} base , ans ;

void power(int b) {
    base.m[0][0] = base.m[1][0] = base.m[0][1] = 1 ; base.m[1][1] = 0 ;
    ans.m[0][0] = ans.m[1][1] = 1 ; ans.m[1][0] = ans.m[0][1] = 0 ;
    while(b) {
        if(b&1) ans = ans * base ;
        base = base * base ;
        b >>= 1;
    }
}

int x , y ;
int exgcd(int a , int b) {
    if(b == 0) { x = 1 ; y = 0 ; return a ; }
    int Ans = exgcd(b , a % b) , t = x ;
    x = y ; y = t - (a / b) * y ;
    return Ans ;
}

int find(int x , int t) {
    int l = 0 , r = t / p + 1 ;
    while(l <= r) {
        int mid = (l + r) >> 1 ;
        if(x + p * mid >= t) r = mid - 1 ;
        else l = mid + 1 ;
    }
    return l ;
}

signed main() {
    int T = read() ;
    while(T--) {
        a1 = read() , l = read() , r = read() , k = read() , p = read() , m = read() ;
        a1 %= p ; power(k - 2) ;
        int mod = (m - a1 * ans.m[1][0] % p + p) % p ;
        int gcd = exgcd(ans.m[0][0] , p) ;
        if(mod % gcd != 0) { puts("0") ; continue ; }
        x = x * (mod/gcd) ; p /= gcd ; x = (x % p + p) % p ;
        outn( find(x , r+1) - find(x , l) ) ;
    }
}

 

posted @ 2018-12-07 19:55  henry_y  阅读(138)  评论(0编辑  收藏  举报