sdoi<序列计数>
链接:https://www.luogu.org/problemnew/show/P3702
题解:
碰到计数题都要想想容斥
就跟碰到最大值最小要想想二分一样
考虑没有一个数是质数
那就确定了每一个数的取值范围
那么dp方程很显然
然后构造矩阵来优化转移
可以发现每个决策时一样的 所以矩阵可以一列一列的复制
- #include <bits/stdc++.h>
- #pragma comment(linker,"/STACK:102400000,102400000")
- #pragma G++ optimize (“O2”)
- using namespace std;
- #define ll long long
- const ll maxn= 2e7+;
- #define mo 20170408
- ll k,n,m;
- bool f[maxn+];
- struct re{
- ll jz1[][],jz2[][];
- }a;
- re tmp,c;
- re XX(re x,re y)
- {
- memset(tmp.jz1,,sizeof(tmp.jz1));
- memset(tmp.jz2,,sizeof(tmp.jz2));
- for (ll i=;i<k;i++)
- for (ll j=;j<k;j++)
- for (ll p=;p<k;p++)
- {
- tmp.jz1[i][p]=(tmp.jz1[i][p]+x.jz1[i][j]*y.jz1[j][p])%mo;
- tmp.jz2[i][p]=(tmp.jz2[i][p]+x.jz2[i][j]*y.jz2[j][p])%mo;
- }
- return(tmp);
- }
- re fastpow(ll x)
- {
- cout<<x<<endl;
- if (x==) return(a);
- c=fastpow(x/);
- c=XX(c,c);
- if (x%) c=XX(c,a);
- return c;
- }
- int main()
- {
- freopen("noip.in","r",stdin);
- freopen("noip.out","w",stdout);
- cin>>n>>m>>k;
- memset(f,,sizeof(f));
- f[]=f[]=;
- for (ll i=;i<=maxn;i++)
- if (f[i])
- {
- ll j=;
- while (j*i<=maxn)
- {
- f[j*i]=; j++;
- }
- }
- for (ll i=;i<=m;i++)
- if (!f[i])
- {
- a.jz1[((-i%k)+k)%k][]++;
- }
- for (ll i=;i<k;i++)
- {
- for (ll j=;j<k;j++)
- a.jz1[j][i]=a.jz1[j-][i-];
- a.jz1[][i]=a.jz1[k-][i-];
- }
- for (ll i=;i<=m;i++)
- a.jz2[((-i%k)+k)%k][]++;
- for (ll i=;i<k;i++)
- {
- for (ll j=;j<k;j++)
- a.jz2[j][i]=a.jz2[j-][i-];
- a.jz2[][i]=a.jz2[k-][i-];
- }
- re d=fastpow(n);
- cout<<(d.jz2[][]-d.jz1[][]+mo)%mo;
- return ;
- }
sdoi<序列计数>的更多相关文章
- BZOJ4818 序列计数
4818: [Sdoi2017]序列计数 Time Limit: 30 Sec Memory Limit: 128 MB Description Alice想要得到一个长度为n的序列,序列中的数都是 ...
- [Sdoi2017]序列计数 [矩阵快速幂]
[Sdoi2017]序列计数 题意:长为\(n \le 10^9\)由不超过\(m \le 2 \cdot 10^7\)的正整数构成的和为\(t\le 100\)的倍数且至少有一个质数的序列个数 总- ...
- BZOJ_4818_[Sdoi2017]序列计数_矩阵乘法
BZOJ_4818_[Sdoi2017]序列计数_矩阵乘法 Description Alice想要得到一个长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的和是p的倍数.Alice还希望 ...
- HDU 6348 序列计数 (树状数组 + DP)
序列计数 Time Limit: 4500/4000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total Subm ...
- luogu3702-[SDOI2017]序列计数
Description Alice想要得到一个长度为nn的序列,序列中的数都是不超过mm的正整数,而且这nn个数的和是pp的倍数. Alice还希望,这nn个数中,至少有一个数是质数. Alice想知 ...
- 【BZOJ 4818】 4818: [Sdoi2017]序列计数 (矩阵乘法、容斥计数)
4818: [Sdoi2017]序列计数 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 560 Solved: 359 Description Al ...
- P3702 [SDOI2017]序列计数
P3702 [SDOI2017]序列计数 链接 分析: 首先可以容斥掉,用总的减去一个质数也没有的. 然后可以dp了,f[i][j]表示到第i个数,和在模p下是j的方案数,矩阵快速幂即可. 另一种方法 ...
- 【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还希 ...
随机推荐
- MongoDB 时差问题问题
在读取的时候,需要再次转换回来,比较麻烦. 其实,Mongo本身就已经提供了相应的处理方法,即在实体类中加个属性即可.具体如下: [BsonDateTimeOptions(Kind = DateTim ...
- 出售爱奇艺 tx好莱坞 优酷 乐视 芒果 搜狐 等一个月会员激活码
出售爱奇艺 tx好莱坞 优酷 乐视 芒果 搜狐 等一个月会员激活码 进群价格有优惠 QQ群:569333649
- ettercap插件介绍
利用sslstrip和ettercap突破ssl嗅探密码 ettercap之DNS欺骗--结合metasploit使用 ettercap支持在运行时加载模块.它们会自动地编译你的系统是否支持他们或者直 ...
- BZOJ3527 [Zjoi2014]力 【fft】
题目 给出n个数qi,给出Fj的定义如下: 令Ei=Fi/qi,求Ei. 输入格式 第一行一个整数n. 接下来n行每行输入一个数,第i行表示qi. 输出格式 n行,第i行输出Ei.与标准答案误差不超过 ...
- C++中模板的使用
为什么使用模板: C++重载(overloading),重载函数一般含有不同的参数个数或不同的参数类型.如果使用MAX函数对不同类型的求最大值,就要定义不同的重载函数: int max(int x,i ...
- 第16月第10天 poco target
1. void TCPServer::start() { poco_assert (_stopped); _stopped = false; _thread.start(*this); } void ...
- POJ 1035 Spell checker (模拟)
题目链接 Description You, as a member of a development team for a new spell checking program, are to wri ...
- R 的农场 chebnear (二分答案+最近平面点对)
题面 \(solution:\) 这道题想到二分答案应该是不难的,因为题目是求平均工资的最小值,这个显然具备单调性: 我们设平均工资的最小值为ans,如果我们现在的平均工资x小于ans那么将x带入题目 ...
- _vimrc(VimScript脚本语言学习)
Windows下 syntax on "高亮 "缩进 set cindent "set cin set smartindent "set si set auto ...
- ASP.NET MVC + EF 更新的几种方式(超赞)
1.常用 db.Entry(实体).State = EntityState.Modified;db.SaveChanges(); 2.指定更新 db.Configuration.ValidateOnS ...