bzoj4818
http://www.lydsy.com/JudgeOnline/problem.php?id=4818
矩阵快速幂+dp
首先我们来写一个dp dp[i][j]:选到第i个数,和为j,复杂度nm,不行,那么我们把j模p一下,复杂度np,还是不行。问题出在n上,那么我们要把n优化掉。
那么我们用矩阵快速幂。
首先构造列向量,dp[0],dp[p-1]
构造系数矩阵,这里我们需要总-没有质数。那么总的矩阵很好构造,当前行为i,列为j,那么我们希望(j+x)%p=i,x=(i-j)%p,那么我们构造好了,没有质数的矩阵把质数挖掉就好了。
行为i表示dp[i],也就是和%p=i,列为j表示当前选的数%p为j,那么dp[i]=tot[j]*dp[x],(j+x)%p=i,tot表示一共有多少数%p=j。
那么就构造好了。系数矩阵倍增,乘上列向量。。。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = , M = , mod = ;
struct mat {
ll a[N][N];
} g1, g2, A1, A2;
int n, m, p;
int pri[M / ], mark[M], x1[N], x2[N];
void Init()
{
mark[] = ;
for(int i = ; i <= m; ++i)
{
if(!mark[i]) pri[++pri[]] = i;
for(int j = ; j <= pri[] && i * pri[j] <= m; ++j)
{
mark[i * pri[j]] = ;
if(i % pri[j] == ) break;
}
}
for(int i = ; i <= m; ++i) ++x1[i % p], x2[i % p] += mark[i];
}
mat operator * (mat A, mat B)
{
mat ret; memset(ret.a, , sizeof(ret.a));
for(int i = ; i < p; ++i)
for(int j = ; j < p; ++j)
for(int k = ; k < p; ++k) ret.a[i][j] = (ret.a[i][j] + A.a[i][k] * B.a[k][j]) % mod;
return ret;
}
mat power(mat x, int t)
{
mat ret; memset(ret.a, , sizeof(ret.a));
for(int i = ; i < p; ++i) ret.a[i][i] = ;
for(; t; t >>= , x = x * x) if(t & ) ret = ret * x;
return ret;
}
int main()
{
scanf("%d%d%d", &n, &m, &p);
Init();
for(int i = ; i < p; ++i)
for(int j = ; j < p; ++j)
g1.a[i][j] += x1[((i - j) % p + p) % p],
g2.a[i][j] += x2[((i - j) % p + p) % p];
for(int i = ; i < p; ++i) A1.a[i][] = x1[i], A2.a[i][] = x2[i];
A1 = power(g1, n - ) * A1;
A2 = power(g2, n - ) * A2;
printf("%lld\n", (A1.a[][] - A2.a[][] + mod) % mod);
return ;
}
bzoj4818的更多相关文章
- 【BZOJ4818】[Sdoi2017]序列计数 DP+矩阵乘法
[BZOJ4818][Sdoi2017]序列计数 Description Alice想要得到一个长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的和是p的倍数.Alice还希望 ,这n个数 ...
- BZOJ4818 LOJ2002 SDOI2017 序列计数 【矩阵快速幂优化DP】*
BZOJ4818 LOJ2002 SDOI2017 序列计数 Description Alice想要得到一个长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的和是p的倍数. Alice还希 ...
- 【BZOJ4818】序列计数(动态规划,生成函数)
[BZOJ4818]序列计数(生成函数) 题面 BZOJ 题解 显然是求一个多项式的若干次方,并且是循环卷积 或者说他是一个\(dp\)也没有问题 发现项数很少,直接暴力乘就行了(\(FFT\)可能还 ...
- bzoj4818 [Sdoi2017]序列计数
Description Alice想要得到一个长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的和是p的倍数.Alice还希望,这n个数中,至少有一个数是质数.Alice想知道,有多少个序 ...
- BZOJ4818 [SDOI2017] 序列计数 【矩阵快速幂】
题目分析: 一个很显然的同类项合并.注意到p的大小最大为100,考虑把模p意义下相同的求出来最后所有的减去没有质数的做矩阵快速幂即可. 代码: #include<bits/stdc++.h> ...
- 2019.02.11 bzoj4818: [Sdoi2017]序列计数(矩阵快速幂优化dp)
传送门 题意简述:问有多少长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的和是p的倍数,且其中至少有一个数是质数,答案对201704082017040820170408取模(n≤1e9, ...
- 【bzoj4818】 Sdoi2017—序列计数
http://www.lydsy.com/JudgeOnline/problem.php?id=4818 (题目链接) 题意 一个长度为$n$的序列,每个元素是不超过$m$的正整数,且这$n$个数的和 ...
- BZOJ4818 序列计数
4818: [Sdoi2017]序列计数 Time Limit: 30 Sec Memory Limit: 128 MB Description Alice想要得到一个长度为n的序列,序列中的数都是 ...
- Bzoj4818:生成函数 快速幂
转来的题面:首先这题显然补集转化,就是用全部方案减去不含任何质数的方案.然后怎么做呢?考虑m比较小,我们能大力把<=m的质数全都筛出来.发现n很大,要么倍增要么快速幂......发现p相当小,所 ...
- 【BZOJ4818】【SDOI2017】序列计数 [矩阵乘法][DP]
序列计数 Time Limit: 30 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description Alice想要得到一个长度为n的序 ...
随机推荐
- 在移动端H5开发中(关于安卓端position:fixed和position:absolute;和虚拟键盘冲突的问题,以及解决方案)
一.在开发移动端webapp时,我们经常会遇到这样的问题,当我们需要在页面底部固定一个logo或者说明时,往往会采用position:fixed进行固定定位或者absolute定位到最底部 这是一个很 ...
- LeetCode(55)Jump Game
题目 Given an array of non-negative integers, you are initially positioned at the first index of the a ...
- LeetCode(50) Pow(x,n)
题目 Implement pow(x, n). Show Tags Show Similar Problems 分析 一个不利用标准幂次函数的,求幂算法实现. 参考了一个很好的解析博客:Pow(x,n ...
- 前端跳转处理--房天下的访问页面部分ip自动跳转到登录页面的解决办法(xjl456852原创)
朋友说自己在访问房天下的页面时,他们页面进行了跳转,跳转到登录页面,说是前端跳转.让我也看看,我看我的机器没有进行跳转. 后来就发现有的机器在访问页面会自动跳转到登录页面.有的不会进行跳转. 比如访问 ...
- package control(转载)
Package Control(扩展包管理器) []Package Control 可以看做是一个ST的扩展管理器,可以去下载.安装.删除 Sublime Text 3的各种插件.皮肤等. [ ...
- java中检测-在运行时指定对象是否是特定类的一个实例---关键字 instanceof
java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例.instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例. if(requ ...
- Linux Shell常用技巧(八) 系统运行状况
十八. 和系统运行状况相关的Shell命令: 1. Linux的实时监测命令(watch): watch 是一个非常实用的命令,可以帮你实时监测一个命令的运行结果,省得一遍又一遍的手动 ...
- 前端开发:JQuery(1)
JQuery DOM文档加载的步骤: 1. 解析HTML结构: 2. 加载外部脚本和样式: 3. 解析并执行脚本代码: 4. DOM树构建完成: 5. 加载图片等外部文件: 6. 页面加载完成: JS ...
- KMP算法 C#实现 字符串查找简单实现
KMP算法 的C#实现,初级版本 static void Main(string[] args) { #region 随机字符 StringBuilder sb = new StringBuilder ...
- Same Tree (二叉树DFS)
Given two binary trees, write a function to check if they are equal or not. Two binary trees are con ...