【bzoj】2326 [HNOI2011]数学作业】的更多相关文章

BZOJ先剧透了是矩阵乘法...这道题显然可以f(x) = f(x-1)*10t+x ,其中t表示x有多少位. 这个递推式可以变成这样的矩阵...(不会用公式编辑器...), 我们把位数相同的一起处理, 那么10^t就可以确定,加上快速幂就行了 ------------------------------------------------------------------------------------ #include<cstdio> #include<cstring>…
题目链接:BZOJ - 2326 题目分析 数据范围达到了 10^18 ,显然需要矩阵乘法了! 可以发现,向数字尾部添加一个数字 x 的过程就是 Num = Num * 10^k + x .其中 k 是 x 的位数. 那么位数相同的数字用矩阵乘法处理就可以了. [Num, x, 1] * [10^k, 0, 0] = [Num*10^k+x, x+1, 1] [      1, 0, 0] [      0, 1, 1] 枚举位数,做多次矩阵乘法. 其中两个整数相乘可能会爆 LL ,那么就用类似…
#include<cstdio> #include<iostream> #include<cstring> #include<cmath> #define ll long long ll b[],x[][],y[][],n,a[],ans,ans1,m; ][],ll q1[][]) { ll q2[][]; memset(q2,,sizeof(q2)); ;i<;i++) ;j<;j++) ;k<;k++) q2[i][j]=(q2[i]…
矩阵乘法一般不满足交换律!!所以快速幂里需要注意乘的顺序!! 其实不难,设f[i]为i的答案,那么f[i]=(f[i-1]w[i]+i)%mod,w[i]是1e(i的位数),这个很容易写成矩阵的形式,然后按每一位分别矩阵快速幂即可 矩阵: f[i-1] w[i] 1 1 f[i] i-1 0 1 1 = i 1 0 0 1 1 #include<iostream> #include<cstdio> using namespace std; long long n,mod,t; lo…
传送门 解题思路 NOIp前看到的一道题,当时想了很久没想出来,NOIp后拿出来看竟然想出来了.注意到有递推\(f[i]=f[i-1]*poww[i]+i\),\(f[i]\)表示\(1-i\)连接起来组成的数字,\(poww[i]\)表示\(10\)的\(i\)的位数次幂,发现这个可以用矩阵快速幂优化,\([f[i],i+1,1]\),转移到\([f[i+1],i+2,1]\),要做\(n\)的位数次快速幂,每次修改一下转移矩阵中\(poww\)的值就行了. 代码 #include<iostr…
首先是DP,分段DP(按位数讨论) 然后每一段构造出它对应的矩阵,用矩阵快速幂加速 type matrix=..,..]of int64; var n,m:int64; a,b,c,d:matrix; function min(x,y:int64):int64; begin if x<y then exit(x); exit(y); end; procedure cheng(var a,b:matrix); var i,j,k:longint; begin do do d[i,j]:=; do…
[题意]给定n和m,求1~n从高位到低位连接%m的结果.n=11时,ans=1234567891011%m.n<=10^18,m<=10^9. [算法]递推+矩阵快速幂 [题解] 考虑枚举位数个数k,对于不同的k单独递推,设f[i]表示1~i的答案,则有: $$f_n=f_{n-1}*10^k+i$$ 转化为矩阵递推式,则有: $$\begin{vmatrix}10^k & 1 & 1\\ 0 & 1 & 1\\0 & 0 & 1\end{vma…
矩阵快速幂,分1-9,10-99...看黄学长的代码理解...然而他直接把答案保存在最后一行(没有说明...好吧应该是我智障这都不知道... #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; #define rep(i,n) for(int i=1;i<=n;i++) #define clr(x,c) memset…
[luogu P3216] [HNOI2011]数学作业 题目描述 小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题: 给定正整数 N 和 M,要求计算 Concatenate (1 .. N) Mod M 的值,其中 Concatenate (1 ..N)是将所有正整数 1, 2, …, N 顺序连接起来得到的数.例如,N = 13, Concatenate (1 .. N)=12345678910111213.小C 想了大半天终于意识到这是一道不可能手算出来的题目,于是他只…
P3216 [HNOI2011]数学作业 题目描述 小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题: 给定正整数 NN 和 MM ,要求计算 Concatenate (1 .. N) Concatenate(1..N) ModMod MM 的值,其中 Concatenate (1 .. N) Concatenate(1..N) 是将所有正整数 1, 2, -, N1,2,-,N 顺序连接起来得到的数.例如, N = 13N=13 , Concatenate (1 .. N)=…
[HNOI2011]数学作业 题目描述: 小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题: 给定正整数 N 和 M ,要求计算\(Concatenate(1..N)\; Mod\;  M\) 的值, 其中 \(Concatenate(1..N)\)  是将所有正整数 1, 2, …, N顺序连接起来得到的数. 例如,N = 13;  \(Concatenate( 1..13) = 12345678910111213\) 小C 想了大半天终于意识到这是一道不可能手算出来的题目…
题目传送门 数学作业 题目描述 小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题: 给定正整数 N和 M,要求计算 Concatenate (1 .. N)Mod M 的值,其中 Concatenate(1..N) 是将所有正整数1,2,…,N 顺序连接起来得到的数.例如,N=13 , Concatenate (1 .. N)=12345678910111213 .小C 想了大半天终于意识到这是一道不可能手算出来的题目,于是他只好向你求助,希望你能编写一个程序帮他解决这个问题.…
题目描述 小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题: 给定正整数 NNN 和 MMM ,要求计算Concatenate(1..N) Concatenate (1 .. N) Concatenate(1..N) ModModMod MMM 的值,其中 Concatenate(1..N) Concatenate (1 .. N) Concatenate(1..N) 是将所有正整数 1,2,…,N1, 2, …, N1,2,…,N 顺序连接起来得到的数.例如,N=13N =…
题目描述 小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题: 给定正整数 N 和 M,要求计算 Concatenate (1 .. N) Mod M 的值,其中 Concatenate (1 ..N)是将所有正整数 1, 2, …, N 顺序连接起来得到的数.例如,N = 13, Concatenate (1 .. N)=12345678910111213.小C 想了大半天终于意识到这是一道不可能手算出来的题目,于是他只好向你求助,希望你能编写一个程序帮他解决这个问题. 输入输…
题目描述 小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题: 给定正整数 N 和 M ,要求计算Concatenate (1 .. N) Mod M 的值,其中 Concatenate (1 .. N) 是将所有正整数 1, 2, …, N顺序连接起来得到的数.例如,N = 13 , Concatenate (1 .. N)=12345678910111213 .小C 想了大半天终于意识到这是一道不可能手算出来的题目,于是他只好向你求助,希望你能编写一个程序帮他解决这个问题.…
题目描述 小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题: 给定正整数 N 和 M,要求计算 Concatenate (1 .. N) Mod M 的值,其中 Concatenate (1 ..N)是将所有正整数 1, 2, -, N 顺序连接起来得到的数.例如,N = 13, Concatenate (1 .. N)=12345678910111213.小C 想了大半天终于意识到这是一道不可能手算出来的题目,于是他只好向你求助,希望你能编写一个程序帮他解决这个问题. 输入输…
题意: 定义函数Concatenate (1 ..N)是将所有正整数 1, 2, …, N 顺序连接起来得到的数,如concatenate(1..5)是12345,求concatenate(1...n)%m的值 思路: 矩阵快速幂,公式为 $$\left[\begin{matrix}f(n)\\n\\1\end{matrix}\right]=\left[\begin{matrix}10^k&1&1\\0&1&1\\0&0&1\end{matrix}\righ…
Description Input Output Sample Input Sample Output HINT Source Solution 递推式长这样:$f[n]=f[n-1]*10^k+n$ 对于每一段位数个数相同的$n$(如$10\sim99,100\sim999,23333\sim66666,1018701389\sim2147483647$),$k$是个定值 然后就可以开心地分段矩阵乘法了,剩下的自己推吧 #include <bits/stdc++.h> using names…
考虑暴力,那么有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<…
题面 一开始看这题看了好久--觉得这题不可做. 结果是看错题了,我居然看着一段长长的C开头的单词,然后就觉得这是卡特兰数--不知道我在想些什么-- 观察到对于 i = 1~9 : f[i] = f[i - 1] * 10 + i; i = 10 ~ 99 : f[i] = f[i - 1] * 100 + i; . . . 总的来说就是: f[i] = f[i - 1] * len[i] + i; 分段做矩阵乘法即可. --…
题目大意:输入n(n<=10^18)和m,将1~n的整数连起来模m输出,比如n=13则输出12345678910111213模m的数. 设f[i]为1~i整数连起来模m的数,i的位数为k,则有f[i]=(f[i-1]*10^k+i)mod m.可以发现f[i-1]和10^k都是会变化的,不能直接矩乘,这就尴尬了>_<.但是仔细想想(跑去问CZL),其实可以分段来矩乘,把k一样的数矩乘(1..9一样,10..99一样,100..999一样)就行了,这样就变成了ax+by+c的形式,b=1,…
我又对着跑出正解的程序调了好久 怕不是眼瞎了 这就是个分段矩阵,我们很容易就得到了递推式 $\(f[i]=f[i-1]*10^k+i\) 其中\(k=log_{10}i\) 于是就是分段矩阵 之后就是代码了,没有加快速乘WA了好久 #include<iostream> #include<cstring> #include<cstdio> #define re register #define LL long long LL n,m; LL ans[4][4],a[4][…
题目描述 题解 矩阵乘法 考虑把相同位数的数放到一起处理: 设有$k$位的数为$[l,r]$,那么枚举从大到小的第$i$个数(即枚举$r-i+1$),考虑其对$Concatenate(l..r)$的贡献: $v_i=(r-i+1)10^{k(i-1)}$ 所以要求的就是: $\sum\limits_{i=1}^{r-l+1}(r-i+1)10^{k(i-1)}\mod m\ =\ \sum\limits_{i=0}^{r-l}(r-i)10^{ki}\mod m$ 这个式子可以使用矩阵乘法解决.…
http://hzwer.com/2831.html #include<cstdio> #include<iostream> #include<vector> using namespace std; typedef long long ll; typedef vector<ll> vec; typedef vector<vec> mat; ll n,MOD; mat operator * (const mat &a,const mat…
最近学了矩阵,kzj大佬推荐了我这一道题目. 乍一眼看上去,没看出是矩阵,就随便打了一个暴力,30分. 然后仔细分析了一波,发现蛮简单的. 结果全wa了,先看看下面的错误分析吧! 首先,设f[n]为最终答案,易得出\[ f[n]=f[n-1]*10+n\] 然后魔改一下:\[ f[n]=f[n-1]*10+n-1 => \] \[\begin{matrix} 10&0&0\\ 1&1&0\\ 1&1&1\\ \end{matrix}\] 信心一波过样例…
题解 我们设f[i]表示前i个数模M意义下的答案 则f[i] = f[i - 1] * 100...0 + i[i是几位就有几个0] 可以写出矩阵递推式: 之后按位数分组矩乘就好了 #include<iostream> #include<cmath> #include<cstdio> #include<cstring> #include<algorithm> #define LL long long int #define REP(i,n) fo…
这道题看着挺难然而其实看破了也挺容易的.首先N极其的大,几乎要炸掉long long ,所以O(n)的算法一定是扑街了,身为一个脑残志坚的OIer,怎能不想到矩阵快速幂优化呢? 有趣的是这道题矩阵有很多种,Q某犇有另一种做法,大家也可以去他那看一看. 答案矩阵是这样的: f[x]   x+1   1 被我们用来求答案的矩阵长这样: 10^t     0      0 1         1      0 0         1      1 其中t随我们现在处理的数的位数而改变. 然后这道题就硬…
想法 最初的想法就是记录当前 \(%m\) 值为cur,到下一个数时 \(cur=cur \times 10^x + i\) n这么大,那就矩阵乘法呗. 矩阵乘法使用的要点就是有一个转移矩阵会不停的用到. 那么这道题中,1~n中所有位数相同的数转移矩阵都相同. \[ \begin{bmatrix} ans & i &1 \end{bmatrix} \begin{bmatrix} 10^x & 0 & 0 \\ 1 & 1 & 0 \\ 1 & 1 &…
2326: [HNOI2011]数学作业 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 1564 Solved: 910 [Submit][Status][Discuss] Description Input Output Sample Input Sample Output HINT Source 题解: 矩乘快速幂,构造矩阵: 其中k为位数,所以分段进行快速幂: 1~9:10~99:100~999:-. 开始4A6W,然后加了快速乘AC了,但…
[HNOI2011]数学作业 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2415  Solved: 1413[Submit][Status][Discuss] Description   思路:令f[n]表示Concatenate(1,n).那么有: f[i]=f[i-1]*10+(i-1)+1   1<=i<=9 f[i]=f[i-1]*100+(i-1)+1  10<=i<=99 …… 因此可用矩阵加速: 但是,这个矩阵是分…