正题


题目大意

给出n,m,kn,m,kn,m,k
v=∏i=1nai(ai∈N+,ai&lt;=m)k(gcd(v,k)=1)v=\frac{\prod_{i=1}^na_i(a_i\in N_+,a_i&lt;=m)}{k}(gcd(v,k)=1)v=k∏i=1n​ai​(ai​∈N+​,ai​<=m)​(gcd(v,k)=1)
求aaa的方案个数mod10007mod\ 10007mod 10007的值


解题思路

fi,jf_{i,j}fi,j​表示前i个数的乘积和k的最大公约数为k的第j个约数时的方案个数。
动态转移方程:
fi,j=∑k=1prcj%prck=0fi−1,k∗f1,prcnprcj/prckf_{i,j}=\sum_{k=1}^{prc_j\%prc_k=0}f_{i-1,k}*f_{1,prcn_{prc_j/prc_k}}fi,j​=k=1∑prcj​%prck​=0​fi−1,k​∗f1,prcnprcj​/prck​​​
prciprc_iprci​为k的第i个约数,prcniprcn_iprcni​为i是k的第几个约数。
然后我们考虑如何求出1∼m1\sim m1∼m内有多少个数与k的最大公约数为k的第i个约数
也就是∑i=1m(gcd(i,k)==d)(d∣n)\sum_{i=1}^m (gcd(i,k)==d)(d|n)∑i=1m​(gcd(i,k)==d)(d∣n)
首先
gcd(i,k)=d⇒gcd(i/d,k)=1gcd(i,k)=d\Rightarrow gcd(i/d,k)=1gcd(i,k)=d⇒gcd(i/d,k)=1(数论基础)
我们可以考虑用容斥,我们将重复偶数次的减去,重复奇数次的加上。
之后预处理一下prcimodprcj==0prc_i\ \ mod\ \ prc_j==0prci​  mod  prcj​==0的情况就好了。


code

#pragma GCC optimize(2)
%:pragma GCC optimize(3)
%:pragma GCC optimize("Ofast")
%:pragma GCC optimize("inline")
%:pragma GCC optimize("-fgcse")
%:pragma GCC optimize("-fgcse-lm")
%:pragma GCC optimize("-fipa-sra")
%:pragma GCC optimize("-ftree-pre")
%:pragma GCC optimize("-ftree-vrp")
%:pragma GCC optimize("-fpeephole2")
%:pragma GCC optimize("-ffast-math")
%:pragma GCC optimize("-fsched-spec")
%:pragma GCC optimize("unroll-loops")
%:pragma GCC optimize("-falign-jumps")
%:pragma GCC optimize("-falign-loops")
%:pragma GCC optimize("-falign-labels")
%:pragma GCC optimize("-fdevirtualize")
%:pragma GCC optimize("-fcaller-saves")
%:pragma GCC optimize("-fcrossjumping")
%:pragma GCC optimize("-fthread-jumps")
%:pragma GCC optimize("-funroll-loops")
%:pragma GCC optimize("-fwhole-program")
%:pragma GCC optimize("-freorder-blocks")
%:pragma GCC optimize("-fschedule-insns")
%:pragma GCC optimize("inline-functions")
%:pragma GCC optimize("-ftree-tail-merge")
%:pragma GCC optimize("-fschedule-insns2")
%:pragma GCC optimize("-fstrict-aliasing")
%:pragma GCC optimize("-fstrict-overflow")
%:pragma GCC optimize("-falign-functions")
%:pragma GCC optimize("-fcse-skip-blocks")
%:pragma GCC optimize("-fcse-follow-jumps")
%:pragma GCC optimize("-fsched-interblock")
%:pragma GCC optimize("-fpartial-inlining")
%:pragma GCC optimize("no-stack-protector")
%:pragma GCC optimize("-freorder-functions")
%:pragma GCC optimize("-findirect-inlining")
%:pragma GCC optimize("-fhoist-adjacent-loads")
%:pragma GCC optimize("-frerun-cse-after-loop")
%:pragma GCC optimize("inline-small-functions")
%:pragma GCC optimize("-finline-small-functions")
%:pragma GCC optimize("-ftree-switch-conversion")
%:pragma GCC optimize("-foptimize-sibling-calls")
%:pragma GCC optimize("-fexpensive-optimizations")
%:pragma GCC optimize("-funsafe-loop-optimizations")
%:pragma GCC optimize("inline-functions-called-once")
%:pragma GCC optimize("-fdelete-null-pointer-checks")
#include<cstdio>
#include<cmath>
#include<algorithm>
#define BPM 10007
#define N 4010
using namespace std;
int n,m,k,frct,prit,fft[N],sum,m1;
int pri[N],frc[N],ff[N][N],ys[10000001],f[N][N];
void dfs(int x,int zf,int ans)//容斥
{if(x>prit) {sum+=m1/ans*zf;return;}dfs(x+1,zf,ans);dfs(x+1,-zf,ans*pri[x]);
}
int main()
{scanf("%d%d%d",&n,&m,&k);int sk=sqrt(k);for(int i=1;i<=sk;i++){if(k%i==0){frc[++frct]=i;if(k/i>sk) frc[++frct]=k/i;}}//求约数sort(frc+1,frc+1+frct);int tmp=k;for(int i=2;i<=sk;i++){if(tmp==1) break;if(tmp%i==0){pri[++prit]=i;while(tmp%i==0) tmp/=i;}}//求质因子if(tmp!=1) pri[++prit]=tmp;sort(pri+1,pri+tmp+1);for(int i=1;i<=frct;i++){ys[frc[i]]=i;sum=0;m1=m/frc[i];dfs(1,1,1);f[1][i]=sum%BPM;}//计算f[1]for(int i=1;i<=frct;i++)for(int j=1;j<=i;j++)if(frc[i]%frc[j]==0)ff[i][++fft[i]]=j;//预处理关系for(int i=2;i<=n;i++)for(int j=1;j<=frct;j++){if(!fft[j]) continue;for(int k=1;k<=fft[j];k++)f[i][j]=(f[i][j]+f[i-1][ff[j][k]]*f[1][ys[frc[j]/frc[ff[j][k]]]])%BPM;//动态转移}printf("%d",f[n][frct]);
}

nssl1176-轨道【数论,Dp】相关推荐

  1. NEFU705(数论+DP)

    题目:Heap #include <iostream> #include <string.h> #include <stdio.h>using namespace ...

  2. Luogu P4161 [SCOI2009]游戏 数论+DP

    ywy神犇太巨辣!!一下就明白了!! 题意:求$lcm(a_1,a_2,...,a_k)$的种类,其中$\Sigma\space a_i <=n$,$a_i$相当于环长 此处的$DP$,相当于是 ...

  3. [ARC086]F - Shift and Decrement 位运算+数论+DP

    题面 可以证明,在最后一次÷2÷2操作之前,不必要进行连续的两次−1-1操作.因为连续的−1-1操作可以通过先÷2÷2来减少操作次数. 我们定义popcount(x)popcount(x)来表示xx二 ...

  4. HDU 6169 Senior PanⅡ(数论+dp)

    Description 给出一个区间[L,R][L,R][L,R],问该区间中所有以KKK作为最小因子(大于1" role="presentation" style=&q ...

  5. HDU 6169 Senior PanⅡ 数论+DP

    题目链接 题意:给定区间[L,R][L,R][L,R]和一个整数KKK,问区间内所有满足其最小因子(111除外)为KKK的数的和. 限制:L,R,K(<=1e11)L,R,K(<=1e11 ...

  6. Codeforces 623B Array GCD 数论,dp

    文章目录 题意 题解 题意 一个序列每个数都大于111,要使整个数列的最大公约数大于111,可以最多删除一个子串,每一个数花费aaa元,也可以给一个数增添111或者减少111,每个数最多操作一次.求达 ...

  7. P4495-[HAOI2018]奇怪的背包【数论,dp】

    正题 题目链接:https://www.luogu.com.cn/problem/P4495 题目大意 nnn个物品大小为viv_ivi​,每个物品有无数个,背包的重量定义为大小和%P\%P%P. q ...

  8. 【USACO】【数论】【DP】 Chapter 4 Section 1,1麦香牛块题解

    题目 题目描述 农夫布朗的奶牛们正在进行斗争,因为它们听说麦当劳正在考虑引进一种新产品:麦香牛块.奶牛们正在想尽一切办法让这种可怕的设想泡汤.奶牛们进行斗争的策略之一是"劣质的包装" ...

  9. 洛谷P4495 奇怪的背包 [HAOI2018] 数论

    正解:数论+dp 解题报告: 传送门! 首先看到这题,跳无数次,自然而然可以想到之前考过好几次了的一个结论--如果只考虑无限放置i,它可以且仅可以跳到gcd(p,v[i]) 举一反三一下,如果有多个i ...

最新文章

  1. array_multisort
  2. excel之根据单元格内容自动修改单元格颜色
  3. 基于Python的频谱分析(二)——频谱泄露
  4. python手机app 授权登录_Appium+unittest+python登录app
  5. visio 模板_盒图模板一键套用,便捷绘制精美盒图图表
  6. servlet实现用户登录
  7. uniapp点击图片放大_想要放大镜将图片放大的效果?你只需这么做即可!
  8. 降级!调离!取消研究生导师资格!西南交大发布最新通报,多人被问责
  9. 试用期这样做更快通过
  10. 2017 开源软件排行_2017年政府和公民如何使用开源解决人类问题
  11. vSphere5.1升级5.5(二)——升级Esxi主机及vmware tools
  12. [Python] L1-030. 一帮一-PAT团体程序设计天梯赛GPLT
  13. 前端---二级级联下拉列表的实现
  14. html中label宽度设置、非替换元素和替换元素
  15. CSS 中文字体的英文名称 (simhei, simsun) 宋体 微软雅黑
  16. 网易相册:停止新用户注册 5月8日停止运营
  17. 性能测试20--Analysis -- 内存与硬盘
  18. 排列组合相关笔试面试题(C++)
  19. PYTHON代码:根据FileRecord和MAP的关系,拼接IBM V7000 精简卷碎片
  20. 农信银支付清算系统题库_[多选] 农信银支付清算系统中()业务只在工作日运行。...

热门文章

  1. [Spring5]IOC容器_Bean管理XML方式_p名称空间注入
  2. [数据结构]对称矩阵和三角矩阵压缩公式
  3. [JavaWeb-HTML]HTML文本标签
  4. C++ class实现链队列(完整代码)
  5. Chain of responsibility(职责链)--对象行为型模式
  6. 37岁跳槽去阿里 p8_36岁阿里p8发帖:手下12个p7,17个p6,亲自写代码毫无中年危机...
  7. 520 钻石争霸赛 7-8浪漫侧影(二叉树的遍历)
  8. 深入理解 JVM Class文件格式(八)
  9. P5175 数列(矩阵快速幂)
  10. HDU 6127 Hard challenge(极角 + 二分)