uva11582 巨大的斐波那契数!

所有计算都是对n取模的,不妨设F(n) = (f(n) % m)   不难发现,当(F(n), F(n+1))重复出现时,整个序列就开始重复,所以数列的前两项为0,1,。。。。 当F(n) 再次出现0, 1...时,就代表0,1中间这一段为循环节。所以预处理mod m 的循环节里的每个数, (2 <= n <= 1000)。


/***********************************************
 * Author: fisty
 * Created Time: 2015/2/17 20:17:25
 * File Name   : uva11582.cpp
 *********************************************** */
#include <iostream>
#include <cstring>
#include <deque>
#include <cmath>
#include <queue>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <string>
#include <vector>
#include <cstdio>
#include <bitset>
#include <algorithm>
using namespace std;
#define Debug(x) cout << #x << " " << x <<endl
#define Memset(x, a) memset(x, a, sizeof(x))
const int INF = 0x3f3f3f3f;
typedef unsigned long long ULL;
typedef pair<int, int> P;
#define FOR(i, a, b) for(int i = a;i < b; i++)
#define MAX_N 1001
ULL n, m;
int MOD;
vector<int> f[MAX_N];
void init(){
    for(int i = 2;i <= 1000; i++){
        int mod = i;
        int a = 0, b = 1, c = (a + b) % mod;
        f[i].push_back(a);
        f[i].push_back(b);
        f[i].push_back(c);
        while(!(b == 0 && c == 1)){
            a = b;
            b = c;
            c = (a % mod + b % mod) % mod;
            f[i].push_back(c);
        }
        f[i].pop_back();
        f[i].pop_back();
    }
}
ULL quick_mod(ULL a,ULL b, int _m){
    ULL ans = 1;
    while(b){
        if(b&1){
            ans = (ans%_m) * (a%_m) % _m;
            b--;
        }
        b /= 2;
        a = (a%_m)*(a%_m)%_m;
    }
    return ans;
}
int main() {
    //freopen("in.cpp", "r", stdin);
    cin.tie(0);
    ios::sync_with_stdio(false);
    int t;
    cin >> t;
    init();
    while(t--){
        cin >> n >> m >> MOD;
        if(MOD == 1){
            cout << 0 << endl;
            continue;
        }
        ULL _m = f[MOD].size();
        ULL ans = quick_mod(n, m, _m);
        cout << f[MOD][ans] << endl;
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值