zoukankan      html  css  js  c++  java
  • 数列 题解

    题目描述

    下面数列的第 n 项:

    (f(0) = a_0 ,f(1) = a_1 ,f(2) = a_2)

    (f(n) = b×f(n − 1) + c×f(n − 2) + d×f(n − 3) + e (n ≥ 3))

    输入格式

    包含 1 行,共 8 个整数:(a_0、a_1、a_2、b、c、d、e、n)

    输出格式

    输出 f(n) 的后 18 位(后 18 位的前缀 0 需要输出,不足 18 位用 0 补齐)。

    样例输入

    1 2 3 4 5 6 7 3
    

    样例输出

    000000000000000035	
    

    数据范围

    对于 30% 的数据,(0 ≤ a_0 ,a_1 ,a_2 ,b,c,d,e,n ≤ 10^6)

    对于 100% 的数据,(0 ≤ a_0 ,a_1 ,a_2 ,b,c,d,e,n ≤ 10^{18})

    没有太多可分析的,直接来个示例代码吧

    // 取最后18位的乘法计算
    ll last18(ll x, ll y) {
    	int a[25] = {0}, b[25] = {0}, c[25] = {0};
    	// 先处理两个高精度的数
    	while (x || a[0] == 0) {
    		a[++a[0]] = x % 10; x /= 10;
    	}
    	while (y || b[0] == 0) {
    		b[++b[0]] = y % 10; y /= 10;
    	}
    	// 乘法只取后18位
    	for (int i = 1; i <= a[0]; ++i) {
    		for (int j = 1; j <= b[0]; ++j) {
    			if (i + j - 1 <= 18) {
    				c[i + j - 1] += a[i] * b[j];
    				c[i + j] += c[i + j - 1] / 10;
    				c[i + j - 1] %= 10;
    			}
    		}
    	}
    
    	// 最后再拼起来
    	ll ret = 0;
    	for (int i = 18; i; --i) {
    		ret = ret * 10 + c[i];
    	}
    	return ret;
    }
    
    struct JZ {
    	ll a[5][5];
    	void one() {
    		memset(a, 0, sizeof(a));
    		for (int i = 1; i <= 4; ++i) a[i][i] = 1;
    	}
    	void init() {
    		memset(a, 0, sizeof(a));
    		a[1][1] = b;
    		a[1][2] = c;
    		a[1][3] = d;
    		a[1][4] = e;
    		a[2][1] = a[3][2] = a[4][4] = 1;
    	}
    	void cheng(JZ &A) { // 矩阵乘法
    		JZ C;
    		memset(C.a, 0, sizeof(C.a));
    		for (int i = 1; i <= 4; ++i) {
    			for (int j = 1; j <= 4; ++j) {
    				for (int k = 1; k <= 4; ++k) {
    					C.a[i][j] = C.a[i][j] + last18(a[i][k], A.a[k][j]);
    					if (C.a[i][j] >= mod) C.a[i][j] -= mod;
    				}
    			}
    		}
    		memcpy(a, C.a, sizeof(a));
    	}
    };
    
    // 矩阵快速幂,求斐波那契数列用
    JZ jzqpow(ll x) {
    	JZ ret;
    	ret.one();
    	JZ base;
    	base.init();
    	while (x) {
    		if (x & 1) {
    			ret.cheng(base);
    		}
    		base.cheng(base);
    		x >>= 1;
    	}
    	return ret;
    }
    // 最后的输出
    void print(ll x) {
    	int a[20];
    	for (int i = 0; i < 18; ++i) {
    		a[i] = x % 10;
    		x /= 10;
    	}
    	for (int i = 17; i >= 0; --i) {
    		printf("%d", a[i]);
    	}
    }
    
  • 相关阅读:
    Jquery Plugin模版
    jquery之extend
    java反射技术实例
    java基础汇总
    Java学习路线
    java的一个爬虫
    Java深度理解——Java字节代码的操纵
    java编程思想-基础
    hdu 5201 The Monkey King【容斥原理+组合数学】
    容斥原理
  • 原文地址:https://www.cnblogs.com/kuangbiaopilihu/p/13305015.html
Copyright © 2011-2022 走看看