1. 程式人生 > >51Nod1355:斐波那契的最小公倍數 (min-max容斥+Mobius反演)

51Nod1355:斐波那契的最小公倍數 (min-max容斥+Mobius反演)

傳送門

題解:
對於fib數列有gcd(fi,fj)=fgcd(i,j)(可用歸納法證明)。
那麼對於gcd(f{T})顯然等於fgcd{T}

怎麼求lcm? 直接min-max對指數容斥即可,易得:

lcmf{T}=STfgcd{S}(1)|S|+1

為了消掉gcd,我們用Mobius反演(乘法意義下),構造g,使得fn=d|ngn,那麼gn=fnd|n,dngd1或者

gn=d|nfdμ(nd)

那麼有:

lcmf{T}=STfgcd{S}(1)|S|+1=ST(d|gcd{S}gd)(1)|S|+1=dgdST,d|gcd{S}(1)|S|+1

顯然如果有任意一個數ai使得整除 d|ai,那麼最後gd會被計算1次。 直接看哪些gd有倍數然後乘起來就好了。

#include <bits/stdc++.h>
using
namespace std; const int N=1e6+50, mod=1e9+7; inline int add(int x,int y) {return (x+y>=mod) ? (x+y-mod) : (x+y);} inline int dec(int x,int y) {return (x-y<0) ? (x-y+mod) : (x-y);} inline int mul(int x,int y) {return (long long)x*y%mod;} inline int power(int a,int b,int rs=1) {for(;b;b>>=1
,a=mul(a,a)) if(b&

相關推薦

51Nod1355小公倍數 min-max+Mobius

傳送門 題解: 對於fib數列有gcd(fi,fj)=fgcd(i,j)gcd(fi,fj)=fgcd(i,j)(可用歸納法證明)。 那麼對於gcd(f{T})gcd(f{T})顯然等於fgcd{

面試題10數列

區別 原創文章 時間 -c 通過 res border cci rgb 斐波那契數指的是這樣一個數列:0、1、1、2、3、5、8、13、21、…… 這個數列從第三個數開始,之後的每一個數都由它前的兩數相加得到。 我們知道在編程中我們可以用遞歸和叠代兩種方法求指定的斐波那契

程式設計題數列

斐波納契數列以遞迴的方法定義:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*) 這個數列從第2項開始,每一項都等於前兩項之和,而且當n趨向於無窮大時,前一項與後一項的比值越來越逼近黃金分割0.618. 1.使用for迴圈實現 def fib(

No.19程式碼練習數列,某數k次冪,模擬實現strlen(),階乘 ,逆置字串遞迴和非遞迴

學習不易,需要堅持。 遞迴 程式呼叫自身的程式設計技巧稱為遞迴( recursion)。遞迴做為一種演算法在程式設計語言中廣泛應用。 一個過程或函式在其定義或說明中有直接或間接呼叫自身的一種方法,它通常把一個大型複雜的問題層層轉化為一個與原問題相似的規模較小的問題來求解,遞迴策略只需

遞迴一數列

/** * 題目:斐波那契數列     * 描述:大家都知道斐波那契數列,現在要求輸入一個整數n,請你輸出斐波那契數列的第n項。n<=39 * 解決方案:方法一:遞迴 *      &

初夏小談三種實現方法C語言版第三種相信你沒見過

斐波那契數列(Fibonaccisequnce),又稱黃金分割數列。研究斐波那契數列有相當重要的價值,例在現代物理、準晶體結構、化學等領域都有直接的應用。因此研究斐波那契數列也是很有必要的。 今天初夏將為大家帶來計算斐波那契數列第n位的三種方法 第一種利用遞迴的方法計算,程式碼相當簡單,但其

劍指 Offer - 7數列

題目描述 大家都知道斐波那契數列,現在要求輸入一個整數n,請你輸出斐波那契數列的第n項(從0開始,第0項為0,n <= 39) 題目連結:https://www.nowcoder.com/practice/c6c7742f5ba7442aada113136ddea

劍指Offer7數列

思路: 1.先初始化第0項為0,第1項為1 2.判斷n是否等於0或者1,若是則返回相應的值 3.當n>=count時,開始進入while迴圈。首先計算出前一項和前前一項的和result,再者將前一項賦值給前前一項,result賦值給前一項,然後count+1。再次判斷n和count

Python中遞迴函式案例數列

遞迴函式是Python語言中較常見的函式,所謂的遞迴就是指在一種計算過程中,其中的每一步都要用到前面一步或者前面幾步的結果,一般有連加或者連乘。其中有一個最經典的例子就是斐波那契數列。 斐波那契數列具體是指1、1、2、3、5、8、13、21、34、……這樣一個數列,從第三個數列開始,每一個數列是由

《劍指offer》面試題10數列

題目一:求斐波那契數列的第n項 寫一個函式,輸入n,求斐波那契(Fibonacci)數列的第n項。斐波那契數列的定義如下: 當n=0時,f(n)=0; 當n=1時,f(n)=1; 當n>1時,f(n)=f(n-1)+f(n-2); 從下往上計算,首先根據 f(0)和 f(

劍指offer-07數列

題目描述 大家都知道斐波那契數列,現在要求輸入一個整數n,請你輸出斐波那契數列的第n項(從0開始,第0項為0)。 n<=39 程式碼實現: public class Solution07 { public int Fibonacci(int n) {

牛客網《劍指offer》之Python2.7實現數列

題目描述 大家都知道斐波那契數列,現在要求輸入一個整數n,請你輸出斐波那契數列的第n項(從0開始,第0項為0)。 n<=39 思路 1、老方法遞迴 直接幹了一個普通遞迴,但是系統判超時 2、 迭代 # -*- coding:utf-8 -

Python (1) 效能試驗數列

def fib(k): #列印 if(k==0 or k==1): return 1 else : return fib(k-1)+fib(k-2) for x in range(60): print (x,"的Fib值是

矩陣快速冪優化遞推式 例數列

首先是一點基礎知識: ① 矩陣相乘的規則:矩陣與矩陣相乘 第一個矩陣的列數必須等於第二個矩陣的行數 假如第一個是m*n的矩陣 第二個是n*p的矩 陣則結果就是m*p的矩陣且得出來的矩陣中元素具有

遞迴數列兔子總數

反覆學習反覆學習。 因為自己對遞迴還是不太熟練,於是做POJ1753的時候就很吃力,就是翻棋子直到棋盤上所有棋子的顏色一樣為止,求最少翻多少次,方法是列舉遞迴。然後就打算先做另一道遞迴的題(從陣列中取

劍指offer面試題10數列Java 實現

題目:大家都知道斐波那契數列,現在要求輸入一個整數n,請你輸出斐波那契數列的第n項。 思路:使用遞迴會重複計算,效率較低,可以用迴圈自下到上計算。 測試用例: 功能測試:輸入3、5、10 等。 邊界測試:輸入0、1、2 效能測試:輸入較大的數(如40、50、

【劍指Offer學習】【面試題9 數列】

O(n)時間O(1)空間實現: public class Test09 { /** * 寫一個函式,輸入n,求斐波那契(Fibonacci) 數列的第n項 *

計蒜客數列

問題: 相信小夥伴們都學過斐波那契數列,它是這樣的一個數列: 1 , 1

《劍指offer》面試題9數列

前言 如果我們需要重複地多次計算相同的問題,通常可以選擇用遞迴或者迴圈兩種不同的方法。遞迴式在一個函式的內部呼叫這個函式自身。而迴圈則是通過設定計算的初始值及終止條件,在一個範圍內重複運算。

【劍指offer】面試題9數列

題目 寫一個函式,輸入n, 求斐波那契數列的第n項。 遞迴 問題規模為: T(n)=T(n−1)+T(n−2) 如果我們估計一下,讓 T(n−1)=T(n−2) 那麼T(n)=2T(n−1) 那麼O(n)=2n 簡介而不高效 long l