• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
Hug_Sea
博客园    首页    新随笔    联系   管理    订阅  订阅

HDU 1757 A Simple Math Problem

题意:给出a0~a9和k、m, f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + …… + a9 * f(x-10); 求f(k)%m。

思路:

矩阵A                  矩阵B

0 1 0 0 0 0 0 0 0 0        f0         f1 

0 0 1 0 0 0 0 0 0 0        f1         f2

0 0 0 1 0 0 0 0 0 0        f2         f3    

0 0 0 0 1 0 0 0 0 0      *      f3 ---------->    f4

0 0 0 0 0 1 0 0 0 0          f4         f5

0 0 0 0 0 0 1 0 0 0        f5         f6

0 0 0 0 0 0 0 1 0 0        f6           f7

0 0 0 0 0 0 0 0 1 0        f7         f8

0 0 0 0 0 0 0 0 0 1        f8           f9

a9 a8 a7 a6 a5 a4 a3 a2 a1 a0   f9         f10

我们看到规律了,每次要到下次个A*B,以此类推则由A*A*A.......A*B;

矩阵建好了,题就好做了。

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1757

 

View Code
 1 #include <cstdio>
 2 #include <cstring>
 3 #include <cmath>
 4 #include <string>
 5 #include <algorithm>
 6 #include <iostream>
 7 using namespace std;
 8 const int N=11;
 9 
10 typedef struct In{
11     int m[N][N];
12 }Matrix;
13 Matrix init,unit;
14 int k,m;
15 int a[N];
16 
17 void Init(){
18     for(int i=1;i<N;i++){
19         for(int j=1;j<N;j++){
20             if(i==j-1) init.m[i][j]=1;
21             else init.m[i][j]=0;
22             unit.m[i][j]=(i==j);
23         }
24     }
25     for(int i=1;i<N;i++)
26         init.m[10][i]=a[N-i];
27 }
28 
29 Matrix Mul(Matrix a,Matrix b){
30     Matrix c;
31     for(int i=1;i<N;i++){
32         for(int j=1;j<N;j++){
33             c.m[i][j]=0;
34             for(int k=1;k<N;k++){
35                 c.m[i][j]+=a.m[i][k]*b.m[k][j];
36                 c.m[i][j]%=m;
37             }
38         }
39     }
40     return c;
41 }
42 
43 Matrix Pow(Matrix a,Matrix b){
44     while(k){
45         if(k&1) b=Mul(a,b);
46         a=Mul(a,a);
47         k>>=1;
48     }
49     return b;
50 }
51 
52 int main(){
53     
54 //    freopen("data.in","r",stdin);
55 //    freopen("data.out","w",stdout);
56     
57     while(scanf("%d%d",&k,&m)!=EOF){
58         for(int i=1;i<N;i++) scanf("%d",&a[i]);
59         if(k<10){
60             printf("%d\n",k%m);
61             continue;
62         }
63         k-=9;
64         Init();
65         Matrix x=Pow(init,unit);
66         int sum=0;
67         for(int i=1;i<N;i++) sum=(sum+x.m[10][i]*(i-1))%m;
68         printf("%d\n",sum);
69     }
70     return 0;
71 }

 

img id=

posted @ 2012-05-01 22:18  Hug_Sea  阅读(138)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3