zoukankan      html  css  js  c++  java
  • BZOJ 1002

    这道题有很多奇妙的方法可以搞。。最科学的当然是基尔霍夫矩阵(按照传统,“我也不知道是什么东西”),详见VFK教主的博客;还有乱七八糟的找规律,网上遍地都是。。我就把这题当作高精度练习题了。。

    (你为什么又抄黄学长模板!?。。

    // BZOJ 1002
    
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    
     const int maxN=100+5, N=100+5;
    
     #define rep(i,a,b) for (int i=a; i<=b; i++)
     #define dep(i,a,b) for (int i=a; i>=b; i--)
     #define read(x) scanf("%d", &x)
     #define fill(a,x) memset(a, x, sizeof(a))
    
     struct Big_int {
     	int len, a[maxN];  // 1..len -> 个 十 百 ...
     	void init() { len=0; fill(a, 0); }
     } f[N];
    
     int n;
    
     // 高精度处理流程:先把数搞出来,然后作进退位,最后处理最高位
     Big_int mul(Big_int a, int k) {  // 高精*单精
     	rep(i,1,a.len) a.a[i]*=k;
     	rep(i,1,a.len) {
     		a.a[i+1]+=a.a[i]/10;
     		a.a[i]%=10;
     	}
     	while (a.a[a.len+1]!=0) a.len++;
     	return a;
     }
    
     Big_int sub(Big_int a, Big_int b) { // 高精-高精(顺便+2)
        a.a[1]+=2;
     	int j=1;
     	while (a.a[j]>=10) a.a[j+1]++, a.a[j]%=10, j++; // 处理进位,勿忘j++!
     	rep(i,1,a.len) {
     		a.a[i]-=b.a[i];
     		if (a.a[i]<0) { a.a[i]+=10; a.a[i+1]--; }
     	}
     	while (a.a[a.len]==0) a.len--;
     	return a;
     }
     
    int main()
    {
        read(n);
        f[1].a[1]=1; f[2].a[1]=5;
        f[1].len=f[2].len=1;
    
        rep(i,3,n) f[i]=sub(mul(f[i-1], 3), f[i-2]);
    
        dep(i,f[n].len,1) printf("%d", f[n].a[i]);
        puts("");
    	
    	return 0;
    }
    


  • 相关阅读:
    ubuntu18.04管理redis
    Mac Vmware虚拟机重启后没有网络
    记Spark写数据到Elasticsearch的报错
    Spark基础和RDD
    PHP日期处理
    集群命令
    hadoop集群时间同步
    HBase读写流程
    Flume简介
    Linux 常用快捷键
  • 原文地址:https://www.cnblogs.com/yearwhk/p/5119863.html
Copyright © 2011-2022 走看看