hdu1568

来源:互联网 发布:反编译软件 编辑:程序博客网 时间:2024/06/08 02:29

小范围暴力

大范围乱搞。。。。。。。。。。。



((1+√5)/2 )^n - ((1-√5)/2)^ n
--------------------------------
             √5 

变成


((1+√5)/2 )^n
------------------
    √5 


小范围本来可以暴力  我练了下矩阵快速幂



#include <cmath>#include <cstdio>#define MOD 100000000LL#define LL long long#define lp(i,j,k) for(int i = j;i <= k;++i)struct MATRIX {LL a[2][2];MATRIX (int x) {a[1][1] = a[0][0] = a[0][1] = a[1][0] = x;}MATRIX operator * (const MATRIX &b) {MATRIX re(0);lp(i,0,1)lp(j,0,1)lp(k,0,1)re.a[i][j] = (re.a[i][j] + a[i][k] * b.a[k][j]);while(re.a[1][1] >= MOD) {re.a[1][1] /= 10;re.a[0][1] /= 10;re.a[0][0] /= 10;re.a[1][0] /= 10;}return re;}}m(1);int n,t;double A = (sqrt(5.0) + 1) / 2;LL ksm (const MATRIX &n,int k) {if(k == -1)return 0;MATRIX p = m,re(1);re.a[1][0] = re.a[0][1] = 0;while(k) {if(k & 1)re = re * p;p = p * p;k >>= 1;}return re.a[0][0];}int main () {m.a[1][1] = 0;while(scanf("%d",&n) != EOF) {if(n <= 10000) {t = ksm(m,--n);while(t >= 10000)t /= 10;printf("%d\n",t);}else {double tt = n * log10(A) + (-0.5)*log10(5.0);tt = tt - (int)tt + 3;tt = pow(10.0,tt);printf("%d\n",(int)tt);}}}


0 0
原创粉丝点击