zoukankan      html  css  js  c++  java
  • poj 3233

    NOIP会考矩乘?看了一下blog,在代码上改得比较易懂一点。。

    这道2次二分作为矩乘的开始

     1 //#include<bits/stdc++.h>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<iostream>
     6 #include<queue>
     7 #define inc(i,l,r) for(i=l;i<=r;i++)
     8 #define dec(i,l,r) for(i=l;i>=r;i--)
     9 #define mem(a) memset(a,0,sizeof(a))
    10 #define ll long long
    11 #define succ(x) (1<<x)
    12 #define NM 100
    13 using namespace std;
    14 int read(){
    15     int x=0,f=1;char ch=getchar();
    16     while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
    17     while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
    18     return x*f;
    19 }
    20 struct matrix{
    21     int a[NM][NM];
    22 }a,b;
    23 int i,j,n,k,inf;
    24 matrix operator+(const matrix&x,const matrix&y){
    25     matrix s;
    26     int i,j;
    27     inc(i,1,n)
    28     inc(j,1,n)
    29     (s.a[i][j]=x.a[i][j]+y.a[i][j])%=inf;
    30     return s;
    31 }
    32 matrix operator*(const matrix&x,const matrix&y){
    33     matrix s;
    34     int i,j,k;
    35     inc(i,1,n)
    36     inc(j,1,n){
    37         s.a[i][j]=0;
    38         inc(k,1,n)
    39         (s.a[i][j]+=x.a[i][k]*y.a[k][j])%=inf;
    40     }
    41     return s;
    42 }
    43 matrix cal(int k){
    44     matrix t=a,s=a;
    45     k--;
    46     while(k>0){
    47         if(k%2)s=s*t;
    48         t=t*t;
    49         k/=2;
    50     }
    51     return s;
    52 }
    53 matrix sum(int x){
    54     matrix tmp,s,t;
    55     if(x==1)return a;
    56     t=cal(x/2);
    57     tmp=sum(x/2);
    58     if(x%2){
    59         s=t*tmp;
    60         s=s+tmp;
    61         s=s+cal(x);
    62     }else{
    63         s=t*tmp;
    64         s=s+tmp;
    65     }
    66     return s;
    67 }
    68 int main(){
    69     n=read();k=read();inf=read();
    70     inc(i,1,n)
    71     inc(j,1,n)a.a[i][j]=read();
    72     b=sum(k);
    73     inc(i,1,n){
    74         inc(j,1,n)printf("%d ",b.a[i][j]);
    75         printf("
    ");
    76     }
    77     return 0;
    78 }
    View Code
  • 相关阅读:
    .Net控件创建热键
    .Net字符串处理
    C++ 中通过函数名字的字符串调用函数
    将.Net应用程序依赖的库文件部署到其他目录下
    VS2012生成事件
    visual studio导出项目模板
    .Net Program Unable to copy a file from objDebug to binDebug
    VBA引用.Net类库
    .Net 自定义事件
    VB.Net 解决winForm界面卡死
  • 原文地址:https://www.cnblogs.com/onlyRP/p/4878705.html
Copyright © 2011-2022 走看看