当前位置: 首页 > news >正文

BZOJ2326 HNOI2011数学作业(矩阵快速幂)

  考虑暴力,那么有f(n)=(f(n-1)*10digit+n)%m。注意到每次转移是类似的,考虑矩阵快速幂。首先对于位数不同的数字分开处理,显然这只有log种。然后就得到了f(n)=a·f(n-1)+b形式的递推式,可以矩阵快速幂。注意这里的b虽然是变化的,但每次变化量相同,给矩阵加一维就好了。

#include<iostream> 
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
int read()
{
    int x=0,f=1;char c=getchar();
    while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
    while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
    return x*f;
}
#define ll long long
ll n;int m;
struct matrix
{
    int n,a[3][3];
    matrix operator *(const matrix&b) const
    {
        matrix c;c.n=n;memset(c.a,0,sizeof(c.a));
        for (int i=0;i<n;i++)
            for (int j=0;j<3;j++)
                for (int k=0;k<3;k++)
                c.a[i][j]=(c.a[i][j]+1ll*a[i][k]*b.a[k][j]%m)%m;
        return c;
    }
}f,a;
int main()
{
#ifndef ONLINE_JUDGE
    freopen("bzoj2326.in","r",stdin);
    freopen("bzoj2326.out","w",stdout);
    const char LL[]="%I64d\n";
#else
    const char LL[]="%lld\n";
#endif
    cin>>n>>m;if (m==1) {cout<<0;return 0;}
    ll t=10;
    f.n=1;f.a[0][0]=0,f.a[0][1]=1,f.a[0][2]=1;
    while (t<=n)
    {
        a.n=3;a.a[0][0]=t%m;a.a[0][1]=a.a[0][2]=0;
        a.a[1][0]=a.a[1][1]=1,a.a[1][2]=0;
        a.a[2][0]=0,a.a[2][1]=1,a.a[2][2]=1;
        for (ll k=t-t/10;k;k>>=1,a=a*a) if (k&1) f=f*a;
        t*=10;
    }
    a.n=3;a.a[0][0]=t%m;a.a[0][1]=a.a[0][2]=0;
    a.a[1][0]=a.a[1][1]=1,a.a[1][2]=0;
    a.a[2][0]=0,a.a[2][1]=1,a.a[2][2]=1;
    for (ll k=n-t/10+1;k;k>>=1,a=a*a) if (k&1) f=f*a;
    cout<<f.a[0][0];
    return 0;
}

 

转载于:https://www.cnblogs.com/Gloid/p/9570107.html

相关文章:

  • 暑假第八周进度总结
  • AngularJS 整理学习
  • ngnix——FastCGI 相关参数调优
  • jmeter 使用cookie管理器
  • 小米OJ刷题日志
  • 广义后缀自动机
  • 编程基本功训练:流程图画法及练习
  • Python入门学习-DAY36-GIL全局解释器锁、死锁现象与递归锁、信号量、Event事件、线程queue...
  • SqlMap使用
  • Maven打war包命令
  • Linux常用Office办公软件
  • 如何在Eclipse下查看JDK源代码
  • legend---三、方法集思路
  • [POI2007] ZAP-Queries (莫比乌斯反演)
  • re:从零开始的数位dp
  • [译]如何构建服务器端web组件,为何要构建?
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • IOS评论框不贴底(ios12新bug)
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • Nacos系列:Nacos的Java SDK使用
  • unity如何实现一个固定宽度的orthagraphic相机
  • VUE es6技巧写法(持续更新中~~~)
  • Vue2.x学习三:事件处理生命周期钩子
  • 开源SQL-on-Hadoop系统一览
  • 设计模式 开闭原则
  • 树莓派 - 使用须知
  • 推荐一个React的管理后台框架
  • MyCAT水平分库
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • ​TypeScript都不会用,也敢说会前端?
  • # 安徽锐锋科技IDMS系统简介
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • %@ page import=%的用法
  • (06)金属布线——为半导体注入生命的连接
  • (12)Linux 常见的三种进程状态
  • (8)STL算法之替换
  • (C)一些题4
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (算法)Game
  • (推荐)叮当——中文语音对话机器人
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • (轉貼) UML中文FAQ (OO) (UML)
  • .net core 连接数据库,通过数据库生成Modell
  • .NET框架设计—常被忽视的C#设计技巧
  • .NET中winform传递参数至Url并获得返回值或文件
  • @JSONField或@JsonProperty注解使用
  • [ vulhub漏洞复现篇 ] AppWeb认证绕过漏洞(CVE-2018-8715)
  • [BUUCTF]-PWN:[极客大挑战 2019]Not Bad解析
  • [C#]winform部署PaddleOCRV3推理模型
  • [c++] 什么是平凡类型,标准布局类型,POD类型,聚合体
  • [C++]类和对象【下】
  • [CSS3备忘] transform animation 等
  • [ISITDTU 2019]EasyPHP