题目链接

LOJ:https://loj.ac/problem/2002

洛谷:https://www.luogu.org/problemnew/show/P3702

Solution

考虑补集转换,用所有数减去只用合数的方案数,我们先考虑算所有数的

首先可以得到一个普及组\(\rm dp\),\(f_{i,j}\)表示当前填了前\(i\)个,总和\({\rm mod}\ p\)为\(j\)的方案数。

记录一个\(cnt_i\)表示\({\rm mod}\ p\)为\(i\)的数的个数。

转移就是\(f_{i,j}=\sum_{k=0}^{p-1}f_{i-1,(j-k){\rm mod}\ p}\cdot cnt_k\)。

然后我们拿矩阵大力优化这个转移就可以过了。

复杂度\(O(p^3\log n)\)。

#include<bits/stdc++.h>
using namespace std; void read(int &x) {
x=0;int f=1;char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-f;
for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';x*=f;
} void print(int x) {
if(x<0) putchar('-'),x=-x;
if(!x) return ;print(x/10),putchar(x%10+48);
}
void write(int x) {if(!x) putchar('0');else print(x);putchar('\n');} #define lf double
#define ll long long #define pii pair<int,int >
#define vec vector<int > #define pb push_back
#define mp make_pair
#define fr first
#define sc second #define FOR(i,l,r) for(int i=l,i##_r=r;i<=i##_r;i++) const int maxm = 2e7+10;
const int inf = 1e9;
const lf eps = 1e-8;
const int mod = 20170408; int add(int x,int y) {return x+y>=mod?x+y-mod:x+y;}
int del(int x,int y) {return x-y<0?x-y+mod:x-y;}
int mul(int x,int y) {return 1ll*x*y-1ll*x*y/mod*mod;} int n,m,p; struct Matrix {
int a[102][102];
Matrix () {memset(a,0,sizeof a);}
Matrix operator * (const Matrix &r) const {
Matrix c;
for(int i=0;i<p;i++)
for(int j=0;j<p;j++)
for(int k=0;k<p;k++)
c.a[i][j]=add(c.a[i][j],mul(a[i][k],r.a[k][j]));
return c;
}
}; Matrix qpow(Matrix a,int x) {
Matrix res;for(int i=0;i<p;i++) res.a[i][i]=1;
for(;x;x>>=1,a=a*a) if(x&1) res=res*a;
return res;
} int pri[maxm],vis[maxm],tot,cnt1[102],cnt2[102]; void sieve() {
cnt1[1]=cnt2[1]=1;
for(int i=2;i<=m;i++) {
if(!vis[i]) pri[++tot]=i;
else cnt2[i%p]++;
cnt1[i%p]++;
for(int j=1;j<=tot&&i*pri[j]<=m;j++) {
vis[i*pri[j]]=1;
if(i%pri[j]==0) break;
}
}
} int solve(int *t) {
Matrix tp,res;
for(int i=0;i<p;i++)
for(int j=0;j<p;j++) tp.a[i][j]=t[(i-j+p)%p];
for(int i=0;i<p;i++) res.a[i][0]=t[i];
return (qpow(tp,n-1)*res).a[0][0];
} int main() {
read(n),read(m),read(p);sieve();
write(del(solve(cnt1),solve(cnt2)));
return 0;
}

最新文章

  1. Lind.DDD.Plugins~插件模式的集成
  2. cookie相关
  3. Centos上搭建基于L2TP的VPN
  4. VBA_Excel_教程:分枝循环结构
  5. 温习SQL server
  6. 改造一下C# Substring()函数
  7. 【转】使用git、git-flow与gitlab工作
  8. 【转】AVL
  9. oracle 对象上锁,不能插入或删除情况
  10. 【剑指offer】二叉树中和为某一值的路径
  11. Swift中数组集合-b
  12. Qt开发初步,循序渐进,preRequest for 蓝图逆袭
  13. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(15)-用户登录详细错误和权限数据库模型设计
  14. mini设计模式
  15. 百度编辑器UEditor 点击上传图片选择框会延迟几秒才会显示 反应很慢(转)
  16. Git使用,将本地项目推送到GitHub上
  17. PTA 7-8 哈利&#183;波特的考试(floyd)
  18. Saltstack安装配置过程
  19. cannot convert from &#39;wchar_t *&#39; to &#39;char *&#39; 问题
  20. SVN目录权限设置

热门文章

  1. WAMP 3.1.0 APACHE 2.4.27 从外网访问
  2. 逆向对抗技术之ring3解除文件句柄,删除文件
  3. Evaluation of Sampling and Cross-Validation Tuning Strategies for Regional-Scale Machine Learning Classification
  4. koa koa-static 静态资源中间件
  5. [Beta]第一次 Scrum Meeting
  6. 关于高负载服务器Kernel的ipv4的TCP参数说明及优化
  7. 安卓之Android.mk多文件以及动态库编译
  8. what&#39;s the RTP协议
  9. java判断手机还是电脑访问
  10. Linux下使用iptables配置防火墙端口转发