题目描述

Alice想要得到一个长度为nn的序列,序列中的数都是不超过mm的正整数,而且这nn个数的和是pp的倍数。

Alice还希望,这nn个数中,至少有一个数是质数。

Alice想知道,有多少个序列满足她的要求。

输入输出格式

输入格式:

一行三个数,n,m,pn,m,p。

输出格式:

一行一个数,满足Alice的要求的序列数量,答案对2017040820170408取模。

输入输出样例

输入样例#1: 复制

3 5 3
输出样例#1: 复制

33

说明

对20\%20%的数据,1\leq n,m\leq1001≤n,m≤100

对50\%50%的数据,1\leq m \leq 1001≤m≤100

对80\%80%的数据,1\leq m\leq 10^61≤m≤106

对100\%100%的数据,1\leq n \leq 10^9,1\leq m \leq 2\times 10^7,1\leq p\leq 1001≤n≤109,1≤m≤2×107,1≤p≤100

时间限制:3s

空间限制:128MB

至少有一个素数的方案=所有方案-没有素数的方案

于是用容斥就变成了简单的dp,先讨论所有方案

令f[i][j]表示i个数,和%p为j的方案数

f[i][j]=∑f[i-1][(j-k+p)%p]*cnt[k]

cnt[k]是1~m中%p等于k的数量

发现显然上式可以写为矩阵

于是用矩阵快速幂就行

然后用欧拉筛把素数筛掉,再做一次

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long lol;
struct Matrix
{
lol a[][];
}pre,ans1,ans2,Mat1,Mat2;
lol n,m,p,Mod=;
long long cnt1[],cnt2[];
lol tot,pri[];
bool vis[];
Matrix operator*(const Matrix a,const Matrix b)
{
lol i,j,k;
Matrix res;
memset(res.a,,sizeof(res.a));
for (k=;k<p;k++)
for (i=;i<p;i++)
if (a.a[i][k])
{
for (j=;j<p;j++)
{
res.a[i][j]+=a.a[i][k]*b.a[k][j];
res.a[i][j]%=Mod;
}
}
return res;
}
Matrix qpow1(lol y)
{lol i;
Matrix res;
memset(res.a,,sizeof(res.a));
for (i=;i<p;i++)
res.a[i][i]=;
while (y)
{
if (y&) res=res*Mat1;
Mat1=Mat1*Mat1;
y=y/;
}
return res;
}
Matrix qpow2(lol y)
{lol i;
Matrix res;
memset(res.a,,sizeof(res.a));
for (i=;i<p;i++)
res.a[i][i]=;
while (y)
{
if (y&) res=res*Mat2;
Mat2=Mat2*Mat2;
y=y/;
}
return res;
}
int main()
{lol i,j;
cin>>n>>m>>p;
cnt1[]++;
for (i=;i<=m;i++)
{
cnt1[i%p]++,cnt1[i%p]%=Mod;
if (vis[i]==)
{
++tot;
pri[tot]=i;
}
for (j=;j<=tot;j++)
{
if (i*pri[j]>m) break;
vis[i*pri[j]]=;
if (i%pri[j]==) break;
}
}
cnt2[]++;
for(i=;i<=m;i++)
if (vis[i]) cnt2[i%p]++,cnt2[i%p]%=Mod;
for (i=;i<p;i++)
{
for (j=;j<p;j++)
{
Mat1.a[i][(i+j)%p]+=cnt1[j]%Mod;
Mat1.a[i][(i+j)%p]%=Mod;
}
}
for (i=;i<p;i++)
pre.a[][i]=cnt1[i];
ans1=qpow1(n-);
ans1=pre*ans1;
for (i=;i<p;i++)
{
for (j=;j<p;j++)
{
Mat2.a[i][(i+j)%p]+=cnt2[j]%Mod;
Mat2.a[i][(i+j)%p]%=Mod;
}
}
for (i=;i<p;i++)
pre.a[][i]=cnt2[i];
ans2=qpow2(n-);
ans2=pre*ans2;
cout<<(ans1.a[][]-ans2.a[][]+Mod)%Mod;
}

[SDOI2017]序列计数的更多相关文章

  1. [Sdoi2017]序列计数 [矩阵快速幂]

    [Sdoi2017]序列计数 题意:长为\(n \le 10^9\)由不超过\(m \le 2 \cdot 10^7\)的正整数构成的和为\(t\le 100\)的倍数且至少有一个质数的序列个数 总- ...

  2. BZOJ_4818_[Sdoi2017]序列计数_矩阵乘法

    BZOJ_4818_[Sdoi2017]序列计数_矩阵乘法 Description Alice想要得到一个长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的和是p的倍数.Alice还希望 ...

  3. 【BZOJ 4818】 4818: [Sdoi2017]序列计数 (矩阵乘法、容斥计数)

    4818: [Sdoi2017]序列计数 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 560  Solved: 359 Description Al ...

  4. P3702 [SDOI2017]序列计数

    P3702 [SDOI2017]序列计数 链接 分析: 首先可以容斥掉,用总的减去一个质数也没有的. 然后可以dp了,f[i][j]表示到第i个数,和在模p下是j的方案数,矩阵快速幂即可. 另一种方法 ...

  5. 【BZOJ4818】[Sdoi2017]序列计数 DP+矩阵乘法

    [BZOJ4818][Sdoi2017]序列计数 Description Alice想要得到一个长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的和是p的倍数.Alice还希望 ,这n个数 ...

  6. BZOJ4818 LOJ2002 SDOI2017 序列计数 【矩阵快速幂优化DP】*

    BZOJ4818 LOJ2002 SDOI2017 序列计数 Description Alice想要得到一个长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的和是p的倍数. Alice还希 ...

  7. [BZOJ4818][SDOI2017]序列计数(动规+快速幂)

    4818: [Sdoi2017]序列计数 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 972  Solved: 581[Submit][Status ...

  8. [bzoj4818][Sdoi2017]序列计数_矩阵乘法_欧拉筛

    [Sdoi2017]序列计数 题目大意:https://www.lydsy.com/JudgeOnline/problem.php?id=4818. 题解: 首先列出来一个递推式子 $f[i][0]$ ...

  9. [BZOJ 4818/LuoguP3702][SDOI2017] 序列计数 (矩阵加速DP)

    题面: 传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=4818 Solution 看到这道题,我们不妨先考虑一下20分怎么搞 想到暴力,本蒟 ...

  10. bzoj4818 [Sdoi2017]序列计数

    Description Alice想要得到一个长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的和是p的倍数.Alice还希望,这n个数中,至少有一个数是质数.Alice想知道,有多少个序 ...

随机推荐

  1. Leetcode 5——Median of Two Sorted Arrays

    题目: There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the ...

  2. Idea简单SpringMVC框架配置

    前边已经介绍过了Struts在Idea上的配置,相对于Struts来说,我觉得SpringMVC有更多的优势,首先Struts是需要对action进行配置,页面发送不同的请求,就需要配置不同的acti ...

  3. alpha-咸鱼冲刺day9-紫仪

    总汇链接 一,合照 emmmmm.自然还是没有的. 二,项目燃尽图   三,项目进展 大概差不多了.不过提交似乎又出了问题正在修改ing 四,问题困难 页面整合啥的凑合一下.因为后面跟着学长速成的PH ...

  4. backpropagation

    github: https://github.com/mattm/simple-neural-network blog: https://mattmazur.com/2015/03/17/a-step ...

  5. 敏捷冲刺报告--Day5

    敏捷冲刺报告--Day5 情况简介 GUI框架重写, 添加功能 任务进度 赵坤: 后端爬虫bug修复 李世钰: GUI编写 黄亦薇:更新sprint backlog.编写每日报告 王成科:召集小组成员 ...

  6. 201621123043 《Java程序设计》第9周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 泛型的定义: 泛型,即"参数化类型".一提到参数,最熟悉的就是定义方法时有形参,然后调用此 ...

  7. 2017-2018-1 我爱学Java 第二周 作业

    Android Game Discussion Questions Answers 20162309邢天岳 20162311张之睿 20162312张家铖 20162313苑洪铭 20162324春旺 ...

  8. Swift 2.2 的新特性

    导读:本文来自SwiftGG翻译组,作者@walkingway基于苹果Swift官方博客中Ted Kremenek所撰写的"Swift 2.2 Released!"文章进行了关于S ...

  9. JAVA_SE基础——57.有了包之后类与类之间的访问使用import语句

    代码1访问代码2 代码1: class Demo3 { public static void main(String[] args) { Demo4 a = new Demo4(); a.print( ...

  10. c# BinaryWriter 和 BinaryReader

    string path = @"C:\Users\Administrator\Desktop\1.txt"; using (FileStream ws = new FileStre ...