51nod 1379 索函数
生活随笔
收集整理的這篇文章主要介紹了
51nod 1379 索函数
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Fib[0]=0,Fib[1]=1,Fib[n]=Fib[n-1]+Fib[n-2] if n>1.
定義索函數(shù)Sor(n)=Fib[0]| Fib[1] |Fib[2]|…|Fib[n].
給定整數(shù)n,要求計(jì)算Sor(n)%1,000,000,007(1e9+7).
?
Input 第1行:給出一個(gè)整數(shù)T,表示有T組數(shù)據(jù)。(1<=T<=10000) 第2行到T+1行,每行一個(gè)整數(shù)n。(0<=n<=10^10) Output 對于每個(gè)測試用例,輸出結(jié)果占一行。 Input示例 2 1 2 Output示例 1 1思路:
因?yàn)槭腔蜻\(yùn)算,那么將其Sor(n)轉(zhuǎn)化為二進(jìn)制,每一位上的值均應(yīng)該為1,那么我們只需要求出二進(jìn)制的位長,便可以求得Sor(n)。
對于斐波那契數(shù)列數(shù)列有:
?
此時(shí)求其以2為底的對數(shù),無法去掉n次冪,很難進(jìn)行進(jìn)一步化簡,我們繼續(xù)考慮:
當(dāng)n趨近于無窮大時(shí):
的值趨近于0,
?
即此時(shí)求出Sor(n)轉(zhuǎn)化為二進(jìn)制時(shí)的長度為:
log2(15√(1+5√2)n) log2(15√(1+5√2)n)
?
進(jìn)行化簡得:
?
可以O(shè)(1)求出Sor(n)的位長len,通過快速冪求出 2^(len+1)的值后減去一得到Sor(n)的數(shù)值。
?
蠻有意思的一道題目。
?
#include <stdio.h> #include <math.h> #define MAXSIZE 90 #define INF 0x3f3f3f3f #define LL long longconst int mod = 1e9+7;double f[MAXSIZE];LL Pow(LL a,LL n) {LL ans = 1;while(n){if(n & 1){ans = (ans*a)%mod;}a = (a*a)%mod;n >>= 1;}return ans%mod; }LL Solve(LL n) {LL ans,len;if(n < MAXSIZE){len = log(f[n])/log(2.0);}elselen = n*log((1+sqrt(5.0))/2.0)/log(2.0) - log(sqrt(5.0))/log(2.0);ans = Pow(2,len+1);return ans; }int main() {f[0] = 0;f[1] = 1;f[2] = 1;for(int i=3;i<MAXSIZE;i++){f[i] = f[i-1] + f[i-2];}int T;LL n;scanf("%d",&T);while(T--){scanf("%lld",&n);if(n==0){printf("0\n");continue;}LL ans = Solve(n);printf("%lld\n",ans-1);}return 0; } View Code
?
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/alan-W/p/8012810.html
總結(jié)
以上是生活随笔為你收集整理的51nod 1379 索函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: react-router 页面离开 提
- 下一篇: Node.js 得到当前目录下文件修改文