首页 > 其他分享 >「ARC020C」 A mod B Problem

「ARC020C」 A mod B Problem

时间:2024-12-20 15:43:38浏览次数:9  
标签:取模 lg ll 矩阵 10 ARC020C Problem mod

题意

最开始有一个空的数 \(s\),给定 \(n\) 组整数 \(a,l\),表示把 \(a\) 复制 \(l\) 次再粘贴到 \(s\) 后,求最终 \(s\) 对 \(b\) 取模的值。

分析

考虑用 \(s_{i}\) 表示第 \(i\) 次操作后的值,我们只需要模拟每一次操作就行了,但是这个 \(l\) 的范围卡的很死。

但我们发现 \(n\) 不是很大且刚好学完矩乘,所以考虑矩阵优化递推,然后发现这题和 ABC129F 很像了。

用矩阵 \([s_i,1]\) 表示一次操作后的数据(由于要加 \(a_{i-1}\),所以有一位常数项),我们要做的是从 \([s_{i-1},1]\) 转移过来,设 \(lg\) 为 \(\lfloor\log_{10} a_{i-1}\rfloor+1\),可以构造出转移矩阵 \(tot\):

\[\begin{bmatrix} 10^{lg}&0\\ a_{i-1}&1 \end{bmatrix} \]

初始矩阵 \(ans\) 为 \([0,1]\),每次更新答案为 \(ans\times tot^l\)。注意取模,一定要给 \(10^{lg}\) 和 \(a_{i-1}\) 取模!

最终时间复杂度为 \(O(n\log l)\),有 \(2^3\) 的常数。

Code

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
#define dbg(x) cout<<#x<<": "<<x<<"\n"
inline ll read(){ll x=0,f=1;char c=getchar();while(c<48||c>57){if(c==45)f=0;c=getchar();}while(c>47&&c<58)x=(x<<3)+(x<<1)+(c^48),c=getchar();return f?x:-x;}
const ll maxn=1e4+5,maxt=2;
ll n,mod;
struct node{ll a,l;}p[maxn];
struct matrix{
    ll mat[maxt][maxt];
    inline matrix operator*(const matrix&u)const{
        matrix res;
        memset(res.mat,0,sizeof(res.mat));
        for(ll i=0;i<maxt;++i){
            for(ll j=0;j<maxt;++j){
                for(ll k=0;k<maxt;++k){
                    res.mat[i][j]=(res.mat[i][j]+mat[i][k]*u.mat[k][j]%mod+mod)%mod;
                }
            }
        }
        return res;
    }
}ans;
inline matrix qpow(matrix a,ll b){
    matrix res;
    memset(res.mat,0,sizeof(res.mat));
    for(ll i=0;i<maxt;++i)res.mat[i][i]=1;
    while(b){
        if(b&1)res=res*a;
        a=a*a,b>>=1;
    }
    return res;
}
signed main(){
    n=read();
    for(ll i=1;i<=n;++i)p[i].a=read(),p[i].l=read();
    mod=read();
    memset(ans.mat,0,sizeof(ans.mat));
    ans.mat[0][1]=1;
    for(ll i=1;i<=n;++i){
        ll lg=1,A=p[i].a;
        while(A)A/=10,lg*=10;
        matrix tot;
        memset(tot.mat,0,sizeof(tot.mat));
        tot.mat[0][0]=lg%mod,tot.mat[0][1]=0;
        tot.mat[1][0]=p[i].a%mod,tot.mat[1][1]=1;
        ans=ans*qpow(tot,p[i].l);
    }
    printf("%lld\n",ans.mat[0][0]);
    return 0;
}

标签:取模,lg,ll,矩阵,10,ARC020C,Problem,mod
From: https://www.cnblogs.com/run-away/p/18144010

相关文章

  • 【Source Insight 快捷功能:多行注释和反注释、add、modify、delete、#if0_#endif】
    SourceInsight快捷功能:多行注释和反注释、#if0_#endif、add、modify、deleteSourceInsight(SI)快捷功能:多行注释和反注释#if0_#endifaddmodifydelete第一步:关闭所有SIproject。然后点击Project-->openproject-->选择Base,添加代码。第二步然后点......
  • WPF GeometryCombineMode Exclue,Intersect,Union,Xor
      <Windowx:Class="WpfApp72.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.micro......
  • Apollo: An Exploration of Video Understanding in Large Multimodal Models
    本文是LLM系列文章,针对《Apollo:AnExplorationofVideoUnderstandinginLargeMultimodalModels》的翻译。阿波罗:大型多模态模型中的视频理解探索摘要1引言2现有的视频问答基准有多有效?3缩放一致性:在模型设计过程中,你能做到多小?4探索视频LMM设计空间:什么......
  • OCS2::ocs2_centroidal_model_质心动量模型
    1.ModelHelperFunctions.cpp1.1updateCentroidalDynamics():质心动力学更新template<typenameSCALAR_T>voidupdateCentroidalDynamics(PinocchioInterfaceTpl<SCALAR_T>&interface,constCentroidalModelInfoTpl<SCALAR_T>&info,......
  • [BZOJ3489] A simple rmq problem
    考虑当没有强制在线时,容易想到一个点\(i\)所影响的区间\([l,r]\)满足\(pr_i<l\lei,i\ler<nx_i\)。显然可以转化为矩阵修改,单点求\(\max\)的问题。那扫描线\(+\set\)轻松拿下。强制在线就把线段树换成主席树就可以了。注意这里不能下传标记,所以得用标记永久化。但是......
  • 你的语言模型实际是一个奖励模型!Direct Preference Optimization:Your Language Model
    直接偏好优化:你的语言模型实际上是一个奖励模型......
  • Hard Demon Problem
    HardDemonProblemSwingisopeningapancakefactory!Agoodpancakefactorymustbegoodatflatteningthings,soSwingisgoingtotesthisnewequipmenton2Dmatrices.Swingisgivenan$n\timesn$matrix$M$containingpositiveintegers.Hehas$q......
  • pdfjs 报错提示Failed to load module script
    参考文章:pdfjs报错提示Failedtoloadmodulescript[JavaScript]MIMEtype异常在服务器好不容易配好nginx转发,jar包,静态资源等,访问网站一切ok,结果打开pdf时,无法预览:F12看了下,接口返回正常啊,说明接口没问题,接着看控制台,oh,问题在这:Failedtoloadmodulescript:Expecte......
  • 【内向基环树】codeforces 2044 G1. Medium Demon Problem (easy version)
    前言基环树,又名环套树,是具有\(n\)个节点和\(n\)条边的图,比树多出现一个环。基环树也根据边的有向和无向分为了有向基环树和无向基环树。有向基环树又可以分为内向基环树和外向基环树。对于有向基环树,若基环树的每个节点的出度均为\(1\),则称为内向基环树;若基环树的每个节点的......
  • CVPR-23 Towards Universal Fake Image Detectors that Generalize Across Generative
    论文标题:TowardsUniversalFakeImageDetectorsthatGeneralizeAcrossGenerativeModels论文链接:https://arxiv.org/abs/2302.10174 01摘要翻译随着生成模型的快速发展,人们对通用假图像检测器的需求日益增长。在这项工作中,我们首先展示了现有的模式,即训练一个深......