[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】约数研究
(有种失踪人口回归的感觉) 约束研究[传送门] (不过好像没有人注意到我这个蒟蒻) 好的不管它啦 最近学数论比较多,所以可能会有好多好多的数论题???(不存在的) 行吧上算法标签: 数论 数论 ...
随机推荐
- 【BZOJ 2434】 [Noi2011]阿狸的打字机 fail树+树状数组
就是考了一个fail树的神奇应用我们建出fail树之后,发现我们就是在求y到根的路径上所有的点在以x为根的子树里的个数,这个我们离线后用树状数组+dfs序即可解决 #include <cstdi ...
- bzoj 4237 稻草人 CDQ
稻草人 Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 1433 Solved: 626[Submit][Status][Discuss] Descr ...
- Spring - IoC(3): Bean 实例的创建方式
创建一个 Bean 实例对象的方法通常有如下方式: 调用构造器创建 Bean 实例 调用静态工厂方法创建 Bean 实例 调用实例工厂方法创建 Bean 实例 使用构造器创建 Bean 实例 XML ...
- Idea工具点滴积累
方法参数提示: keymap里面搜索 quick document,默认是F2
- 【洛谷 P4211】[LNOI2014]LCA(树链剖分,差分)
题目链接 看到题目肯定首先想到要求LCA(其实是我菜),可乍一看,n与q的规模为5W, 求LCA的复杂度为\(O(logN)\),那么总时间复杂度为\(O(nq\ log\ n)\). 怎么搞呢? 会 ...
- 最短路算法详解(Dijkstra,Floyd)
最短路径 在一个无权的图中,若从一个顶点到另一个顶点存在着一条路径,则称该路径长度为该路径上所经过的边的数目,它等于该路径上的顶点数减1.由于从一个顶点到另一个顶点可能存在着多条路径,每条路径上所经过 ...
- hdu 4506 小明系列故事——师兄帮帮忙
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4506 题目大意:找规律,判断k的t次幂前面的系数. #include <iostream> ...
- c 語言 控制碼
source code #include <stdio.h> int main() { char *test = "ABC\x41\n"; printf("s ...
- CHM文件出现的常见错误及解决办法
一.chm文件内容乱码: 解决方式:将IE浏览器的编码换成自动选择,或者选择UTF-8和GBK看那个能使用.因为chm文件默认的是IE浏览器的内核. 二.easy chm软件编译文件时左侧索引乱码,源 ...
- picker鼠标上下拖动选择内容
上次写这个的时候的博客:http://hiuman.iteye.com/blog/2324929 上次是网上搜的,这次是自己写的. 无论多少个input都可以点击-但是只有一种内容(弹出的内容),可以 ...



