Luogu P3216 [HNOI2011]数学作业 【矩阵快速幂】

本文介绍了一个复杂的数学问题求解过程,通过构建特定的矩阵运算来高效计算由所有正整数顺序连接而成的数的第N位。利用矩阵乘方加速计算,并通过递推式简化问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题:

给定正整数 N 和 M ,要求计算 Concatenate (1 .. N) Mod M 的值,其中 Concatenate (1 .. N) 是将所有正整数 1, 2,...., N顺序连接起来得到的数。例如, N=13 , Concatenate (1 .. N)=12345678910111213 .小C 想了大半天终于意识到这是一道不可能手算出来的题目,于是他只好向你求助,希望你能编写一个程序帮他解决这个问题。

输入输出格式

输入格式:

从文件input.txt中读入数据,输入文件只有一行且为用空格隔开的两个正整数N和M,其中30%的数据满足 1\leq N\leq1000000 ;100%的数据满足 1 \leq N \leq10^{18} 且 1 \leq M \leq10^{9} .

 

输出格式:

 

输出文件 output.txt 仅包含一个非负整数,表示 Concatenate (1 .. N) 的值。

 

输入输出样例

输入样例#1: 

13 13

输出样例#1: 

4

思路:根据题意易得递推式为F\left ( n \right )=F\left ( n-1 \right )*10^k+n \left(k为n的位数),直接构造矩阵是不可行的,因为矩阵中不存在10^k这种变量。考虑按位数构造矩阵,那这时候10^k就可以看作一个常数,注意不同位数的矩阵之间的衔接就没问题了。

\begin{pmatrix} 10^k & 1 & 0\\ 0 & 1 & 1\\ 0 & 0 & 1 \end{pmatrix} *  \begin{pmatrix} F\left ( n-1 \right ) \\ n \\ 1 \end{pmatrix} =  \begin{pmatrix} F\left ( n \right ) \\ n+1 \\ 1 \end{pmatrix} 

 

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<vector>
#include<queue>
#include<stack>
#include<set>
#include<map>
#include<climits>
using namespace std;
#define M(a,b) memset(a,b,sizeof(a))
#define pb push_back
typedef long long LL;
const int maxn = 100000+5;
struct Matrix {
    LL mat[3][3];
};
LL n,mod;
Matrix operator * (Matrix a,Matrix b) {
    Matrix res;
    for (int i=0;i<3;++i) {
        for (int j=0;j<3;++j) {
            res.mat[i][j]=0;
            for (int k=0;k<3;++k) {
                res.mat[i][j]=res.mat[i][j]+a.mat[i][k]*b.mat[k][j];
                res.mat[i][j]%=mod;
            }
        }
    }
    return res;
}
Matrix operator ^ (Matrix a,LL p) {
    Matrix res;
    M(res.mat,0);
    for (int i=0;i<3;++i) {
        res.mat[i][i]=1;
    }
    while(p) {
        if (p&1) {
            res=res*a;
        }
        a=a*a;
        p>>=1;
    }
    return res;
}
LL f[20];
int main() {


    scanf("%lld%lld",&n,&mod);
    Matrix A,ans;
    ans.mat[0][0]=0; ans.mat[0][1]=0;ans.mat[0][2]=0;
    ans.mat[1][0]=1;ans.mat[1][1]=0;ans.mat[1][2]=0;
    ans.mat[2][0]=1; ans.mat[2][1]=0;ans.mat[2][2]=0;
    A.mat[0][0]=10; A.mat[0][1]=1;A.mat[0][2]=0;
    A.mat[1][0]=0;  A.mat[1][1]=1;A.mat[1][2]=1;
    A.mat[2][0]=0;  A.mat[2][1]=0;A.mat[2][2]=1;

    int k = 0;
    LL tp=n;
    while(tp) {
        tp/=10;
        ++k;
    }
    f[0]=1;
    for (int i=1;i<=k;++i) {
        f[i]=(f[i-1]<<3)+(f[i-1]<<1);
    }
    for (int i=1;i<=k;++i) {
        A.mat[0][0]=f[i]%mod;
        LL cnt;
        if (i==k) {
            cnt = n - f[i-1] + 1;
        }
        else {
            cnt = f[i] - f[i-1];
        }
        ans=(A^cnt)*ans;
    }
    printf("%lld\n",ans.mat[0][0]);
    return 0;
}

 

内容概要:该研究通过在黑龙江省某示范村进行24小时实地测试,比较了燃煤炉具与自动/手动进料生物质炉具的污染物排放特征。结果显示,生物质炉具相比燃煤炉具显著降低了PM2.5、CO和SO2的排放(自动进料分别降低41.2%、54.3%、40.0%;手动进料降低35.3%、22.1%、20.0%),但NOx排放未降低甚至有所增加。研究还发现,经济性和便利性是影响生物质炉具推广的重要因素。该研究不仅提供了实际排放数据支持,还通过Python代码详细复现了排放特征比较、减排效果计算和结果可视化,进一步探讨了燃料性质、动态排放特征、碳平衡计算以及政策建议。 适合人群:从事环境科学研究的学者、政府环保部门工作人员、能源政策制定者、关注农村能源转型的社会人士。 使用场景及目标:①评估生物质炉具在农村地区的推广潜力;②为政策制定者提供科学依据,优化补贴政策;③帮助研究人员深入了解生物质炉具的排放特征和技术改进方向;④为企业研发更高效的生物质炉具提供参考。 其他说明:该研究通过大量数据分析和模拟,揭示了生物质炉具在实际应用中的优点和挑战,特别是NOx排放增加的问题。研究还提出了多项具体的技术改进方向和政策建议,如优化进料方式、提高热效率、建设本地颗粒厂等,为生物质炉具的广泛推广提供了可行路径。此外,研究还开发了一个智能政策建议生成系统,可以根据不同地区的特征定制化生成政策建议,为农村能源转型提供了有力支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值