zoukankan      html  css  js  c++  java
  • 【矩阵乘法】bzoj2326 [HNOI2011]数学作业

    http://hzwer.com/2831.html

    #include<cstdio>
    #include<iostream>
    #include<vector>
    using namespace std;
    typedef long long ll;
    typedef vector<ll> vec;
    typedef vector<vec> mat;
    ll n,MOD;
    mat operator * (const mat &a,const mat &b)
    {
    	mat c(a.size(),vec(b[0].size()));
    	for(int i=0;i<a.size();++i)
    	  for(int j=0;j<b[0].size();++j)
    	    for(int k=0;k<b.size();++k)
    	      c[i][j]=(c[i][j]+(a[i][k]%MOD)*(b[k][j]%MOD)%MOD)%MOD;
    	return c;
    }
    mat Quick_Pow(mat x,ll p)
    {
    	if(!p)
    	  {
    	  	mat t(3,vec(3));
    	  	for(int i=0;i<3;++i) t[i][i]=1;
    	  	return t;
    	  }
    	mat res=Quick_Pow(x,p>>1);
    	res=res*res;
    	if(p&1) res=res*x;
    	return res;
    }
    int main()
    {
    	cin>>n>>MOD;
    	ll now=10;
    	mat base(3,vec(3));
    	base[0][0]=now;
    	base[0][1]=base[0][2]=base[1][1]=base[1][2]=base[2][2]=1;
    	mat fir(3,vec(1));
    	fir[2][0]=1;
    	while(now<=n)
    	  {
    	  	mat kbase=Quick_Pow(base,now-now/10);
    	  	fir=kbase*fir;
    	  	now*=10;
    	  	base[0][0]=now;
    	  }
    	mat kbase=Quick_Pow(base,n-now/10+1);
    	fir=kbase*fir;
    	cout<<fir[0][0]<<endl;
    	return 0;
    }
  • 相关阅读:
    Splay复习
    带权并查集复习-HDU3038
    罗素悖论-图灵停机问题
    数独解法c++实现
    状压DP NOI2001 炮兵阵地
    区间第k大数
    分块随笔T2
    分块感想
    webkit的高级属性
    设计模式
  • 原文地址:https://www.cnblogs.com/autsky-jadek/p/4502540.html
Copyright © 2011-2022 走看看