[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】约数研究
(有种失踪人口回归的感觉) 约束研究[传送门] (不过好像没有人注意到我这个蒟蒻) 好的不管它啦 最近学数论比较多,所以可能会有好多好多的数论题???(不存在的) 行吧上算法标签: 数论 数论 ...
随机推荐
- 微信小程序使用原生WebSokcet实现断线重连及数据拼接
以前做小程序为了应急找了个插件去链接WebSokcet,文章传送门. 回过头在新项目中再次使用时出现了些许问题,不一一赘述.遂决定好好用一下原生的WebSokcet. 一.说明 1.小程序原生的Web ...
- CentOS系统缺少库文件解决办法
By francis_hao May 31,2017 程序在编译时出现缺少库文件的提示,如下: as: error while loading shared libraries: libz. ...
- 安卓下拉刷新空间SwipeRefreshLayout的基本使用
1.先写布局文件 <android.support.v4.widget.SwipeRefreshLayout android:id="@+id/refresh" androi ...
- D. Equalize the Remainders (set的基本操作)
D. Equalize the Remainders time limit per test 3 seconds memory limit per test 256 megabytes input s ...
- php文件上传错误代码
注意: 1.上传文件的时候,在html里面的form表单一定要标注:enctype='multipart/form-data' 2.有种说法,要求一定要在form表单里面,在file前面加上隐藏域如: ...
- [05] call by sharing || 共享参数
转: https://segmentfault.com/a/1190000005177386 众所周知,JavaScript中参数是按值传递的.与访问变量不同,基本类型和引用类型的参数在传递时都如同变 ...
- 转:JVM Server与Client运行模式
转自:http://blog.csdn.net/zhuyijian135757/article/details/38391785 JVM Server模式与client模式启动,最主要的差别在于:-S ...
- jsp分页完善版
明天要考网络工程师了,而且这两天校运会,把那个分页的完善了下,明天考试,祈祷吧,我根本都没看书啊,所以只能去长见识了.100大洋啊,下个学期我想考考证了,不然以后出去麻烦了.呵呵,不多说还是说说自己对 ...
- HDU2157 How many ways??---(邻接矩阵,图论,矩阵快速幂)
http://acm.hdu.edu.cn/showproblem.php?pid=2157 How many ways?? Time Limit: 2000/1000 MS (Java/Others ...
- JetbrainsCrack
http://blog.csdn.net/lcyong_/article/details/61205672 http://blog.csdn.net/nn_jbrs/article/details/7 ...