1. 程式人生 > >1005 Number Sequence(廣義斐波那契數列)

1005 Number Sequence(廣義斐波那契數列)

Problem Description
A number sequence is defined as follows:

f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.

Given A, B, and n, you are to calculate the value of f(n).

Input
The input consists of multiple test cases. Each test case contains 3 integers A, B and n on a single line (1 <= A, B <= 1000, 1 <= n <= 100,000,000). Three zeros signal the end of input and this test case is not to be processed.

Output
For each test case, print the value of f(n) on a single line.

Sample Input
1 1 3
1 2 10
0 0 0

Sample Output
2
5

網上的題解都是找規律,那如果mod再大一點就不行了,所以我用快速矩陣冪做的,適用於廣義斐波那契數列

#include<bits/stdc++.h>
using namespace std;
const int mod=7;
using LL=int64_t;
struct Node {
    LL m[3][3];
}sum,base
; Node muilt(Node a,Node b) { Node temp; for(int i=0;i<2;i++) { for(int j=0;j<2;j++) { temp.m[i][j]=0; for(int k=0;k<2;k++) temp.m[i][j]=(a.m[i][k]*b.m[k][j]+temp.m[i][j])%mod; } } return temp; } LL q_mod(LL a,LL b,LL n) { sum.m[0
][0]=sum.m[1][0]=1; sum.m[0][1]=sum.m[1][1]=0; base.m[0][0]=a%mod; base.m[0][1]=b%mod; base.m[1][0]=1,base.m[1][1]=0; n-=2; while(n) { if(n&1) sum=muilt(base,sum); n>>=1; base=muilt(base,base); } return sum.m[0][0]; } int main() { ios::sync_with_stdio(0); cin.tie(0); LL a,b,n; while(cin>>a>>b>>n&&a&&b&&n) { if(n<=2) { if(n==1) cout<<a<<endl; else if(n==2) cout<<b<<endl; } else cout<<q_mod(a,b,n)<<endl; } return 0; }

相關推薦

1005 Number Sequence廣義數列

Problem Description A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7. G

【杭電-oj】-1865-1sting大數數列

1sting Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5021    Accepted Submiss

Java 兔子問題數列擴展篇

aik 第一個 truct func main target htm bre trace Java 兔子問題(斐波那契數列)擴展篇 斐波那契數列指的是這樣一個數列 0, 1, 1, 2,3, 5, 8, 13, 21, 34, 55, 89, 144, ...對於這個

[洛谷P1349]廣義數列

矩陣加速 解題思路 string 簡單 set c++ mat 題目 n-1 題目大意:設$f[n]=f[n-1]*p+f[n-2]*q(當n>2時)$,給你p,q,f[1],f[2],n,m,求f[n]mod m的值。 解題思路:明顯,遞推是會TLE的,我們又得用

洛谷——P1349 廣義數列

分享 for iostream amp size alt 以及 hide pre 題目描述 廣義的斐波那契數列是指形如an=p*an-1+q*an-2的數列。今給定數列的兩系數p和q,以及數列的最前兩項a1和a2,另給出兩個整數n和m,試求數列的第n項an除以m的余數。

找一找數列

數列 || amp question 滿足 mil 一個 輸出 family 題目要求:給定n個正整數,請找出其中有多少個數x滿足:在這n個數中存在數y,使y=kx,其中k為大於1的整數 輸入描述 : 第一行輸入一個n,接下來一行輸入n個正整數ai 輸出描述:輸出符合條件個

P1349 廣義數列

ans oid 範圍 span ive 基本 article space while 題目描述 廣義的斐波那契數列是指形如an=p*an-1+q*an-2的數列。今給定數列的兩系數p和q,以及數列的最前兩項a1和a2,另給出兩個整數n和m,試求數列的第n項an除以m的

[Luogu] 廣義數列

數列 problem 題解 get .org www. org com targe https://www.luogu.org/problemnew/show/P1349 題解:https://www.zybuluo.com/wsndy-xx/note/1152988[L

【CF446C】DZY Loves Fibonacci Numbers 線段樹 + 數列

nac ++ return isp mat span 先來 sum scrip Description ? 看題戳我 給你一個序列,要求支持區間加斐波那契數列和區間求和。\(~n \leq 3 \times 10 ^ 5, ~fib_1 = fib_2 = 1~\). So

[洛谷P1349] 廣義數列

tdi 裸題 == pre lin () long pan targe 復習矩陣乘法。 題目傳送門 裸題、水題。 a[n] a[n-1] * p 1 = a[n+1] a[n]

Java中的不死神兔數列

三種方法實現例項: package test17_digui; import java.util.Scanner; /* * 題目:有一對兔子,從出生後第3個月起每個月都生1對兔子,小兔子第三個月後也可以生一對兔子, * 假如兔子不死,在指定月份時刻一共可以有多少對兔子 *

java:遞迴練習數列

package com.heima.test; public class Test5 { public static void main(String[] args) { demo1(); System.out.println(fun(8)); } //使用陣列求斐波那契數列

【矩陣乘法x2】LuoGu P1349 廣義數列&&LNSYOJ#395遞推式字首和

這是兩道矩陣的水題 題目描述 數列f[n]=f[n-1]+f[n-2]+n+1,f[1]=f[2]=1的前n項和s[n]=f[1]+f[2]+……+f[n]的快速求法(答案取模10e9+7) 輸入格式 一個整數bb。 輸出格式 一個整數字首和。

兔子的繁殖問題數列

Problem A: 兔子的繁殖問題 假設一對兔子每月能生一對小兔(一雌一雄),每對小兔出生後的下一個月是沒有繁殖能力的,至出生後的第三個月開始又可以每月生一對小兔,問從一對剛出生的小兔開始,經過若干個月後一共有多少兔子(假設在此過程中兔子沒有死亡)? 這個問題

codeforces316E3 Summer Homework線段樹,數列

pan hang 題目 using queue main scanf spa 維護 題目大意 給定一個n個數的數列,m個操作,有三種操作: \(1\ x\ v\) 將\(a_x\)的值修改成v \(2\ l\ r\\) 求 \(\sum_{i=l}^r x_i*f_{i-

矩陣快速冪數列為例

小 M 玩數列 【問題描述】 小 W 發現了一個神奇的數列: () = ( − 1) + ( − 2) { ≥ 3, (1) = 1, (2) = 1} ,這就是著名的 Fibonacci Se

再刷PAT系列~ 1008 童年生活二三事數列

題目描述 NowCoder小時候走路喜歡蹦蹦跳跳,他最喜歡在樓梯上跳來跳去。 但年幼的他一次只能走上一階或者一下子蹦上兩階。 現在一共有N階臺階,請你計算一下NowCoder從第0階到第N階共有幾

極值問題-數列

已知m、n為整數,且滿足下列兩個條件: ① m、n∈{1,2,…,k},即1≤m,n≤k ②(n2-m*n-m2)2=1 你的任務是:程式設計輸入正整數k(1≤k≤109),求一組滿足上述兩個條件的m、n,並且使m2+n2的值最大。例如,從鍵盤輸入k=199

不死兔數列

public static void main(String[] args) { /** * 需求:有一對兔子,從出生後第3個月起每個月都生一對兔子, * 小兔子長到第三個月後每個月又生一對兔子, * 假如兔子都不死,問第二十個月的兔子對數為多少? *

fibonacii數列數列的遞迴實現及迴圈實現

public class Fibonacii { public static long fibo(int num){ //遞迴方法 if(num==1||num==2) //定義出口 return 1; return fibo(num-1)+fibo(