[BZOJ4772]显而易见的数论(数论)
4772: 显而易见的数论
Time Limit: 40 Sec Memory Limit: 256 MB
Submit: 76 Solved: 32
[Submit][Status][Discuss]Description
Input
Output
Sample Input
input 1
1
3 3
0 1 2input 2
2
5 4
4 1 5 2input 3
3
7 5
12 11 45 6 2Sample Output
output 14
output 2
31output 3
7346HINT
Source
预处理即$O(1)$求$F$显然不是瓶颈,关键是g和最终答案的求法。
比较自然的思路是枚举$p_i$,$p_j$,算出它们的出现次数和贡献,累计结果。
这个分情况讨论,整数划分DP一下就好了。
https://www.cnblogs.com/xiaoxubi/p/6927810.html
然后根据一波迷之推导得出$g$是一个积性函数,这样线性筛预处理即可。
https://blog.csdn.net/v5zsq/article/details/76714310
这样时间复杂度问题方面就解决了,然而这题卡时卡空间,任何一个取模运算较多的操作都有可能超时。
可以看出$p_i\neq p_j$的常数过大,所以用$cnt$数组先统计出$a[i]$一共被累计了几次,最后一起乘起来就好了。
#include<cstdio>
#include<algorithm>
#define rep(i,l,r) for (int i=l; i<=r; i++)
using namespace std; const int N=,M=,mod=;
int type,n,K,tot,ans,gcd[N][N],f[N][N],sum[N],mul[N][N];
int tmp[M],cnt[M],g[M],pri[M],a[M];
bool jud[M]; void add(int &x,int y){ x+=y; if (x>=mod) x-=mod; } void pre1(){
sum[n]=;
rep(i,,n) rep(j,,n){
if (i== || j==) f[i][j]=;
else if (j==i) f[i][j]=(f[i][j-]+)%mod;
else if (j<i) f[i][j]=(f[i-j][j]+f[i][j-])%mod;
else f[i][j]=f[i][j-];
sum[n-i]=f[i][i];
}
} void pre2(){
g[]=; g[]=;
rep(i,,){
if (!jud[i]) pri[++tot]=tmp[i]=i,g[i]=(*i-)%mod;
for (int j=; j<=tot && i*pri[j]<=M; j++){
jud[i*pri[j]]=;
if (i%pri[j]) tmp[i*pri[j]]=pri[j],g[i*pri[j]]=g[i]*g[pri[j]]%mod;
else{
tmp[i*pri[j]]=tmp[i]*pri[j];
if (tmp[i]!=i) g[i*pri[j]]=1ll*g[i/tmp[i]]*g[tmp[i]*pri[j]]%mod;
else g[i*pri[j]]=(1ll*g[i]*pri[j]+i*pri[j]-i)%mod;
break;
}
}
}
} void pre3(){
rep(i,,n) gcd[i][]=gcd[][i]=gcd[i][i]=i,gcd[][i]=gcd[i][]=;
rep(i,,n) rep(j,,i){
if (!gcd[i][j]) gcd[i][j]=gcd[j][i-j];
gcd[j][i]=gcd[i][j];
}
rep(i,,n){
mul[i][]=;
rep(j,,n) mul[i][j]=1ll*mul[i][j-]*i%K;
}
} int F(int pi,int pj){
if (type==) return %K;
if (type==) return gcd[pi][pj]%K;
if (type==) return (mul[pi][pj]+mul[pj][pi]+(pi^pj))%K;
return ;
} int main(){
freopen("bzoj4772.in","r",stdin);
freopen("bzoj4772.out","w",stdout);
scanf("%d%d%d",&type,&n,&K);
for (int i=; i<K; i++) scanf("%d",&a[i]);
pre1(); pre2(); pre3();
/*
rep(i,1,n) rep(j,i+1,n-i)
for (int muli=1; i*muli<=n-j; muli++)
for (int mulj=1; i*muli+j*mulj<=n; mulj++){
int t=(sum[muli*i+mulj*j]-sum[(muli+1)*i+mulj*j]-sum[muli*i+(mulj+1)*j]+sum[(muli+1)*i+(mulj+1)*j])%mod;
add(cnt[F(i,j)],1ll*muli*mulj*(t+mod)%mod);
}
*/
rep(i,,n) rep(j,i+,n-i)
for (int muli=; i*muli<=n-j; muli++)
for (int mulj=; i*muli+j*mulj<=n; mulj++) add(cnt[F(i,j)],sum[muli*i+mulj*j]);
for (int i=; i<K; i++) add(ans,1ll*g[a[i]]*cnt[i]%mod);
rep(i,,n) for (int muli=; i*muli<=n; muli++)
add(ans,(1ll*g[a[F(i,i)]]*((muli*(muli-)/)%mod))%mod*(sum[muli*i]-sum[(muli+)*i]+mod)%mod);
printf("%d\n",ans);
return ;
}
[BZOJ4772]显而易见的数论(数论)的更多相关文章
- bzoj4772 显而易见的数论
题意:http://www.lydsy.com/JudgeOnline/problem.php?id=4772 sol :这个题卡了我一整天QAQ 出题人简直丧心病狂,卡内存+卡常数QAQ 题意就是, ...
- 洛谷$P5330\ [SNOI2019]$数论 数论
正解:数论 解题报告: 传送门$QwQ$ ,,,这题还蛮妙的$QwQ$(,,,其实所有数论题对我来说都挺妙的$kk$然后我真的好呆昂我理解了好久$QAQ$ 考虑先建$Q$个点,编号为$[0,Q)$,表 ...
- NOIP复习之1 数学数论
noip一轮复习真的要开始啦!!! 大概顺序是这样的 1.数学 2.搜索贪心 3.数据结构 4.图论 5.dp 6.其他 数学 1.数论 数论被称为数学皇冠上的明珠,他的重要性主要在于它是其他学习的祖 ...
- PKUSC2018训练日程(4.18~5.30)
(总计:共66题) 4.18~4.25:19题 4.26~5.2:17题 5.3~5.9: 6题 5.10~5.16: 6题 5.17~5.23: 9题 5.24~5.30: 9题 4.18 [BZO ...
- 写在SDOI2016Round1前的To Do List
理性的整理了一下自己的不足. 计算几何啥都不会,字符串类DP毫无练习,数据结构写的不熟,数论推不出式子,网络流建模常建残: 需要达成的任务: 一.网络流: 熟练网络流的板子(之前一直仰慕zkw费用流, ...
- 夏令营讲课内容整理 Day 6 Part 2.
Day 6的第二部分,数论 数论是纯粹数学的分支之一,主要研究整数的性质 1.一些符号: a mod b 代表a除以b得到的余数 a|b a是b的约数 floor(x) 代表x的下取整,即小于等于 ...
- LOJ #6303. 水题 (约数 质因数)
#6303. 水题 内存限制 10 MiB 时间限制:1000 ms 标准输入输出 题目描述 给定正整数 n,kn, kn,k,已知非负整数 xxx 满足 n!modkx=0,求 xmaxx_{max ...
- 清明 DAY2
数论 数论是研究整数性质的东西 也就是 lim π(x)=x/ ln x (x->无穷) 证明: ∵ p|ab ∴ ab有因子p 设 a=p1k1p2k2......prkr b= ...
- 【洛谷p1403 】【AHOI2005】约数研究
(有种失踪人口回归的感觉) 约束研究[传送门] (不过好像没有人注意到我这个蒟蒻) 好的不管它啦 最近学数论比较多,所以可能会有好多好多的数论题???(不存在的) 行吧上算法标签: 数论 数论 ...
随机推荐
- BZOJ2631 tree(伍一鸣) LCT 秘制标记
这个题一看就是裸地LCT嘛,但是我wa了好几遍,这秘制标记...... 注意事项:I.*对+有贡献 II.先下传*再下传+(因为我们已经维护了+,不能再让*对+产生贡献)III.维护+用到size # ...
- vue双向绑定原理
要了解vue的双向绑定原理,首先得了解Object.defineProperty()方法,因为访问器属性是对象中的一种特殊属性,它不能直接在对象中设置,而必须通过 Object.definePrope ...
- Nginx 默认配置解析
# For more information on configuration, see: # * Official English Documentation: http://nginx.org/e ...
- HDU 5878---预处理+二分查找
给一个数n,让你求一个大于等于n的最小的满足题意中2^a*3^b*5^c*7^d的数字. 思路: #include<iostream> #include<cstdio> #in ...
- 02-导航实例-storyboard实现
源代码下载链接:02-导航实例-storyboard实现.zip38.5 KB // MJAboutViewController.h // // MJAboutViewController. ...
- Linux 远程登录——(九)
Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE /* Style Definitions */ table.MsoNormalTable ...
- VMX指令集
指令 作用 VMPTRLD 加载一个VMCS结构体指针作为当前操作对象 VMPTRST 保存当前VMCS结构体指针 VMCLEAR 清除当前VMCS结构体 VMREAD 读VMCS结构体指定域 VMW ...
- 【反演复习计划】【bzoj3529】数表
Orz PoPoQQQ大爷 按照他ppt的解法,这题可以划归到之前的题了OrzOrz 跪wy写的题解(Stealth Assassin)https://www.luogu.org/wiki/show? ...
- 【bzoj3227】红黑树
神TM的红黑树,其实本质上应该还是一种树dp的问题…… 一开始想了一个比较裸的树dp,后来发现还有更强的做法. 每个前端黑节点是看作一个物品,然后这就是很典型的树形dp的问题. 不过可以这么考虑,考虑 ...
- LINUX环境下的GUN MAKE学习笔记(二)
第三章:makefile总述 3.1makefile的内容 在一个完整的makefile中,包含显示规则.隐含规则.变量定义.指示符和注释.下面讨论一些基本概念: 显示规则:它描述了在何种情况下如何更 ...



