暑假集訓Day 7 李時珍的皮膚衣

題目大意

LSZ很皮!LSZ的皮膚衣更皮!c++

LSZ有不少件神奇的皮膚衣,並且LSZ老是喜歡一次穿上多件皮膚衣(一件套一件,並且一直穿好多天),這些皮膚衣有透明或不透明兩種狀態,當不透明的皮膚衣吸取了一天的陽光直射後,就會變成透明的皮膚衣,透明的皮膚衣能使陽光照射到裏層皮膚衣,而透明的皮膚衣再吸取陽光,會在次日會變成不透明的皮膚衣,不透明的皮膚衣會阻止陽光照射到裏層皮膚衣。算法

LSZ從某天起(該天算做第1天)穿上N(N <= \(4*10^{9}\))件皮膚衣(剛開始全部皮膚衣都是不透明的),問你最少要通過多少天,LSZ身上的皮膚衣都經歷過透明變化?數組

例現在天(公元2018年6月17日)LSZ穿了3件皮膚衣服,會在公元2018年6月21日3件皮膚衣都會經歷過透明變化。spa

輸入格式

一行,只有一個整數N。code

輸出格式

最少的天數(對N取餘數)blog

樣例


樣例輸入


3

樣例輸出


2

樣例解釋

  • 使用0表明皮膚衣透明狀態。
  • 使用1表明皮膚衣不透明的狀態。


5對3取餘數爲2。數學

算法分析:

這個題算是一個比較裸的數論的題了吧,很顯然的式子,先來定義一個數組f[i]表示有i個衣服要變透明所須要的天數it

  • 若是咱們要求f[n] :咱們只須要把第n個變成0就能夠了 前提是將前n-1個由1變成0 假設咱們已經知道了前n-1個由1變成0須要的天數爲x 則f[n]就是下x+1
  • 若是求f[n+1]呢:那麼咱們再去推第n+1個變成0的天數 前提是前n個變成0的時間 前n個都是0須要 前n-1個變成0 而後第n個變成0 而後前n-1個再變成0 而後再加1(使第n+1個變成0)因此f[n+1] = x+1+x = 2(x+1)-1 = 2f[n]-1
  • 將f[n+1]和f[n]創建關係了 可是對於\(4*10^{10}\)這樣大的數據顯然沒法經過遞推求解,因此咱們須要一個通式,先來f[1] = 2 ,f[2] = 3,經過一點點數學方法(等比數列加代換或者直接眼暴)很容易就知道f[n] = \(2^{n-1} - 1\)
  • 而後就能夠求解了 那咱們的主要問題就變成了怎麼求\(2^{n-1}-1\)顯然快速冪唄
  • 而後就是個快速冪板子了

代碼展現

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

ll power(ll a,ll b,ll p){
	ll ans = 1%p;
	for(;b;b>>=1){
		if(b&1)ans = ans*a%p;
		a = a * a % p;
	}
	return ans;
}

int main(){
	ll n;scanf("%lld",&n);
	ll ans = power(2,n-1,n);
	ans = (ans + 1)%n;
	printf("%lld",ans);
	return 0;
}

謝謝觀看
點個關注class

_<方法

相關文章
相關標籤/搜索