首页
Python
Java
IOS
Andorid
NodeJS
JavaScript
HTML5
【
bzoj2326:[HNOI2011]数学作业(分段矩阵乘法)
】的更多相关文章
bzoj2326:[HNOI2011]数学作业(分段矩阵乘法)
题目大意:输入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,…
[BZOJ 2326] [HNOI2011] 数学作业 【矩阵乘法】
题目链接: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 ,那么就用类似…
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<…
BZOJ2326 [HNOI2011]数学作业 【矩阵快速幂】
题解 我们设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…
BZOJ2326 [HNOI2011]数学作业(分块矩阵快速幂)
题意: 定义函数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…
[BZOJ2326] [HNOI2011] 数学作业 (矩阵乘法)
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…
bzoj2326: [HNOI2011]数学作业
矩阵快速幂,分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…
P3216 [HNOI2011]数学作业 (矩阵快速幂)
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)=…
BZOJ 2326 数学作业(分段矩阵快速幂)
实际上,对于位数相同的连续段,可以用矩阵快速幂求出最后的ans,那么题目中一共只有18个连续段. 分段矩阵快速幂即可. #include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<algorithm> #include<queue> #include<cmath> #define ll long long using na…
【矩阵乘法】bzoj2326 [HNOI2011]数学作业
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…