zoukankan      html  css  js  c++  java
  • 数学作业

    f[i]表示计算了前i位的值,f[i]=f[i-1]*10^k+i

    N太大了,发现是线性常系数递推,要用矩阵来优化,就是10^n+0~10^n+9一起计算

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cmath>
     5 using namespace std;
     6 typedef long long ll;
     7 ll n,mod;
     8 struct matrix{
     9     int n,m; 
    10     ll mat[10][10];
    11     matrix(int n=0,int m=0):n(n),m(m){}
    12     void clear(){memset(mat,0,sizeof(mat));}
    13     void iden(){
    14         memset(mat,0,sizeof(mat));
    15         for(int i=0;i<n;i++) mat[i][i]=1;
    16     }
    17     matrix operator*(const matrix b) const{
    18         if(m!=b.n) exit(2);
    19         int p=b.m;
    20         matrix c(n,b.m);
    21         c.clear();
    22         for(int i=0;i<n;i++){
    23             for(int j=0;j<p;j++){
    24                 for(int k=0;k<m;k++){
    25                     c.mat[i][j]+=mat[i][k]*b.mat[k][j];
    26                     c.mat[i][j]%=mod;
    27                 } 
    28             }
    29         } 
    30         return c;
    31     }
    32     matrix operator^(ll p){
    33         matrix ret(n,n),tmp;
    34         ret.iden();
    35         for(tmp=*this;p;p>>=1,tmp=tmp*tmp){
    36             if(p&1) ret=ret*tmp;
    37         }
    38         return ret;
    39     } 
    40 };
    41 char buf[2007];
    42 int main(){
    43     ll n,bit;
    44     scanf("%lld%lld",&n,&mod);
    45     sprintf(buf,"%lld",n);
    46     bit=strlen(buf);
    47     matrix ans(1,3);
    48     ans.clear();
    49     ans.mat[0][2]=1;
    50     for(int i=1;i<=bit;i++){
    51         ll unit=pow(10,i-1);
    52         matrix com(3,3);
    53         com.clear();
    54         com.mat[0][0]=unit%mod*10%mod;
    55         com.mat[1][0]=com.mat[1][1]=com.mat[2][0]=com.mat[2][1]=com.mat[2][2]=1;
    56         if(i!=bit) ans=ans*(com^(unit*9));//10^n+0~10^n+9一起计算 
    57         else ans=ans*(com^(n-unit+1));//到最后逐个计算 
    58         for(int i=0;i<3;i++) cout<<ans.mat[0][i]<<" ";
    59         cout<<endl; 
    60     }
    61     printf("%lld",ans.mat[0][0]);//不能加& 
    62     return 0;
    63 }

    return 0是c语言中的保留字,指示程序正常结束,而exit()是一个库函数,后面可以加参数;
    exit(0)也可以正常退出,如果加其它的数值:1,2,....可以表示由于不同的错误原因而退出

    sprintf(string,"%f",num);
    string是一个字符串,num是你要的数字,这样就能将浮点数num转成字符串string了

    用矩阵乘法计算斐波那契额数列:

     1 #include <bits/stdc++.h>
     2 
     3 using namespace std;
     4 typedef long long ll;
     5 const ll mod = 19260817;
     6 const int N = 2;
     7 struct Matrix{
     8     ll a[N][N];
     9     
    10     void clear(){
    11         memset(a, 0, sizeof(a));
    12     }
    13     
    14     Matrix operator * (const Matrix b) const{
    15         Matrix ret; ret.clear();
    16         for(int i = 0; i < N; i ++){
    17             for(int j = 0; j < N; j ++){
    18                 for(int k = 0; k < N; k ++){
    19                     ret.a[i][j] = (ret.a[i][j] + a[i][k] * b.a[k][j]) % mod;
    20                 }
    21             }
    22         }
    23         return ret;
    24     }
    25 }A, B;
    26 
    27 
    28 Matrix qpow(Matrix A, ll b){
    29     Matrix ret; ret.clear();
    30     for(int i = 0; i < N; i ++) ret.a[i][i] = 1;
    31     for(; b; b >>= 1, A = A * A){
    32         if(b & 1) ret = ret * A;
    33     }
    34     return ret;
    35 }
    36 ll n;
    37 int main(){
    38     scanf("%lld", &n);
    39     A.clear(); A.a[0][0] = A.a[0][1] = A.a[1][0] = 1;
    40     B = qpow(A, n - 1);
    41     ll ans = 0;
    42     cout<<B.a[0][0]<<" "<<B.a[0][1]<<endl; 
    43     ans = (B.a[0][0] + B.a[0][1]) % mod;
    44     printf("%lld
    ", ans);
    45 }
  • 相关阅读:
    BFS visit tree
    Kth Largest Element in an Array 解答
    Merge k Sorted Lists 解答
    Median of Two Sorted Arrays 解答
    Maximal Square 解答
    Best Time to Buy and Sell Stock III 解答
    Best Time to Buy and Sell Stock II 解答
    Best Time to Buy and Sell Stock 解答
    Triangle 解答
    Unique Binary Search Trees II 解答
  • 原文地址:https://www.cnblogs.com/lcan/p/9540284.html
Copyright © 2011-2022 走看看