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 2

input 2
2
5 4
4 1 5 2

input 3
3
7 5
12 11 45 6 2

Sample Output

output 1

4

output 2
31

output 3
7346

HINT

Source

[Submit][Status][Discuss]

预处理即$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]显而易见的数论(数论)的更多相关文章

  1. bzoj4772 显而易见的数论

    题意:http://www.lydsy.com/JudgeOnline/problem.php?id=4772 sol :这个题卡了我一整天QAQ 出题人简直丧心病狂,卡内存+卡常数QAQ 题意就是, ...

  2. 洛谷$P5330\ [SNOI2019]$数论 数论

    正解:数论 解题报告: 传送门$QwQ$ ,,,这题还蛮妙的$QwQ$(,,,其实所有数论题对我来说都挺妙的$kk$然后我真的好呆昂我理解了好久$QAQ$ 考虑先建$Q$个点,编号为$[0,Q)$,表 ...

  3. NOIP复习之1 数学数论

    noip一轮复习真的要开始啦!!! 大概顺序是这样的 1.数学 2.搜索贪心 3.数据结构 4.图论 5.dp 6.其他 数学 1.数论 数论被称为数学皇冠上的明珠,他的重要性主要在于它是其他学习的祖 ...

  4. 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 ...

  5. 写在SDOI2016Round1前的To Do List

    理性的整理了一下自己的不足. 计算几何啥都不会,字符串类DP毫无练习,数据结构写的不熟,数论推不出式子,网络流建模常建残: 需要达成的任务: 一.网络流: 熟练网络流的板子(之前一直仰慕zkw费用流, ...

  6. 夏令营讲课内容整理 Day 6 Part 2.

    Day 6的第二部分,数论 数论是纯粹数学的分支之一,主要研究整数的性质   1.一些符号: a mod b 代表a除以b得到的余数 a|b a是b的约数 floor(x) 代表x的下取整,即小于等于 ...

  7. LOJ #6303. 水题 (约数 质因数)

    #6303. 水题 内存限制 10 MiB 时间限制:1000 ms 标准输入输出 题目描述 给定正整数 n,kn, kn,k,已知非负整数 xxx 满足 n!modkx=0,求 xmaxx_{max ...

  8. 清明 DAY2

    数论 数论是研究整数性质的东西 也就是 lim   π(x)=x/ ln x (x->无穷) 证明: ∵ p|ab ∴ ab有因子p 设 a=p1k1p2k2......prkr      b= ...

  9. 【洛谷p1403 】【AHOI2005】约数研究

    (有种失踪人口回归的感觉) 约束研究[传送门] (不过好像没有人注意到我这个蒟蒻) 好的不管它啦 最近学数论比较多,所以可能会有好多好多的数论题???(不存在的) 行吧上算法标签: 数论   数论  ...

随机推荐

  1. bzoj 4555 [Tjoi2016&Heoi2016]求和 NTT 第二类斯特林数 等比数列求和优化

    [Tjoi2016&Heoi2016]求和 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 679  Solved: 534[Submit][S ...

  2. 使用http_load网站压力测试

    http_load用以测试web服务器的吞吐量与负载.但是它不同于大多数压力测试工具, 它可以以一个单一的进程运行,一般不会把客户机搞死.它可以自定义测试的URL列表 下载:http://acme.c ...

  3. php模板引擎smarty

    一. smarty的特点 速度:相对于其他模板引擎,速度较快 编译型:在下次访问模板时直接访问编译文件,不再进行模板重新编译 缓存技术:可以将用户最终看到的HTML文件缓存成一个静态HTML 插件技术 ...

  4. windows mysql 安装及启动

    0.下载:

  5. 【SPOJ-QTREE3】树链剖分

    http://www.spoj.com/problems/QTREE3/ 时间限制:2s    代码长度限制:50000B     内存限制:1536MB [题目描述] 给出N个点的一棵树(N-1条边 ...

  6. HDU2481 Toy

    Time Limit: 16000/8000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission ...

  7. [BZOJ1151][CTSC2007]动物园zoo 解题报告|DP|位运算

    Description 最近一直在为了学习算法而做题,这道题是初一小神犇让我看的.感觉挺不错于是写了写. 这道题如果是一条线的话我们可以构造一个DP f[i,j]表示以i为起点,i,i+1...i+4 ...

  8. python自带的线程池和进程池

    #python自带的线程池 from multiprocessing.pool import ThreadPool #注意ThreadPool不在threading模块下 from multiproc ...

  9. python3 进程_multiprocessing模块

    '''多进程优点:可以利用多核,实现并行运算缺点:1.开销太大: 2.通信困难使用方式跟开多线程一样''' 多进程 import multiprocessing import time,os def ...

  10. swoole扩展安装

    1Swoole扩展的编译安装 Swoole扩展是按照php标准扩展构建的.使用phpize来生成php编译配置,./configure来做编译配置检测,make和make install来完成安装. ...