cogs1277 数学作业 矩阵快速幂

填坑……链接:http://cogs.pro/cogs/problem/problem.php?pid=1277

题意:求出数列$f(x)=f(x-1)*10^{lg(x)}+x$的第$n$项。

我真的不知道怎么玩了……这个该死的$lg(x)$卡死了我……最后不得不把我的手伸向了黄学长博客……最后震惊了……

这两个矩阵就是需要的……然后对于每一个$k$都求一遍就行了……

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 long long n,m;
 7 struct matrix
 8 {
 9     long long a[4][4];
10     matrix(){clear();}
11     void clear(){memset(a,0,sizeof(a));}
12     matrix operator *(const matrix &b)const
13     {
14         matrix c;
15         for(int i=1;i<=3;i++)
16             for(int j=1;j<=3;j++)
17                 for(int k=1;k<=3;k++)c.a[i][j]=(c.a[i][j]+(a[i][k]%m)*(b.a[k][j]%m))%m;
18         return c;
19     }
20 }mmm,ans;
21 void calc(long long val,long long tim)
22 {
23     mmm.clear();
24     mmm.a[1][1]=val;
25     mmm.a[1][2]=mmm.a[2][2]=mmm.a[1][3]=mmm.a[3][3]=mmm.a[2][3]=1;
26     for(long long y=tim-val/10+1;y;y>>=1,mmm=mmm*mmm)
27         if(y&1)ans=mmm*ans;
28 }
29 int haha()
30 {
31     freopen("mathwork.in","r",stdin);
32     freopen("mathwork.out","w",stdout);
33     scanf("%lld%lld",&n,&m);
34     for(int i=1;i<=3;i++)ans.a[i][i]=1;
35     long long t=10;
36     while(n>=t)calc(t,t-1),t*=10;
37     calc(t,n);
38     printf("%lld\n",ans.a[1][3]);
39 }
40 int sb=haha();
41 int main(){;}
cogs1277

 

转载于:https://www.cnblogs.com/Loser-of-Life/p/7360106.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值