bzoj4772 显而易见的数论
题意:http://www.lydsy.com/JudgeOnline/problem.php?id=4772
sol :这个题卡了我一整天QAQ
出题人简直丧心病狂,卡内存+卡常数QAQ
题意就是,给你一个整数,让你求所有整数划分的方案数的价值和,价值是个函数
长成这个样子:
∑划分方案数
然后就是,考虑枚举pi和pj,如何算这个二元组在整数划分中出现的次数
记sum[i]为将i进行整数划分的方案数(实际操作时为避免数组下标为负所以将sum反向)
- sum[]=;
- for(int i=;i<=n;i++)
- {
- for(int j=;j<=n;j++)
- {
- if(i==||j==) f[i][j]=;
- else if(i==j) f[i][j]=(f[i][j-]+)%p;
- else if(i<j) f[i][j]=f[i][j-];
- else f[i][j]=(f[i-j][j]+f[i][j-])%p;
- }
- sum[i]=f[i][i];
- }
当pi!=pj的时候,枚举pi和pj出现的次数muli,mulj,那么答案即为ans[pi][pj]+=sum[n-pi*muli-pj*mulj]
而当pi=pj时,同样枚举pi出现的次数,我们要考虑两两组合的方案数
即ans[pi][pi]+=muli*(muli-1)/2*(sum[muli*pi]-sum[(muli+1)*pi])
然后我到这就不会了QAQ,于是去请教了Nbc和Claris,%%%
Nbc表示这个题就是个暴力随便搞搞就行了......我:
Claris表示其实这个g是个积性函数......我:
好了这个题可以做了QAQ
我们考虑g(n)在n为质数的情况下的值为2n-2,所以直接预处理线性筛一发g(x)就行了QAQ
然后对于那个F(i,j)我们可以预处理一发gcd和pow就可以O(1)做了
于是我们的做法就是,枚举不相等的i和j,统计答案
- for(int i=;i<=n;i++)
- for(int j=i+;j<=n-i;j++)
- for(int muli=;muli*i+j<=n;muli++)
- for(int mulj=;mulj*j+muli*i<=n;mulj++)
- ans+=g[a[F(i,j)]]*sum[muli*i+mulj*j]%p,ans%=p;
然后再枚举相等的i和j,统计答案
- for(int i=;i<=n;i++)
- for(int muli=;muli*i<=n;muli++)
- ans=(ans+g[a[F(i,i)]]*muli*(muli-)/*(sum[muli*i]-sum[(muli+)*i]+p))%p;
然后我们就愉悦的发现他0ms TLE了
哦....原来是define int long long炸内存了啊QAQ
简单的改了改然后交上去,发现他又偷♂税的T掉了......
我们发现在统计不相等的i和j时的取模操作太多了QAQ
于是我们可以手动实现一发取模操作...然而我并不会乘法取模,怎么办呢?
我们发现乘法取模是因为乘了一个g[],然而F(i,j)的范围只有1e5,奥妙重重
考虑开一个数组Cnt记录F的每个值的访问次数,这样的话在后面一次性统计即可
- for(int i=;i<=n;i++)
- for(int j=i+;j<=n-i;j++)
- for(int muli=;muli*i+j<=n;muli++)
- for(int mulj=;mulj*j+muli*i<=n;mulj++)
- mod(Cnt[F(i,j)],sum[muli*i+mulj*j]);
- for(int i=;i<K;i++) ans+=1LL*g[a[i]]*Cnt[i]%p,ans%=p;
于是这道题就可以切掉了QwQ
附上完整代码
- #include<iostream>
- #include<algorithm>
- #include<cstdio>
- #include<cstring>
- using namespace std;
- const int p=1e9+;
- const int Mx1=;
- const int Mx2=1e7+;
- int tp,n,K,a[Mx2],sum[Mx1],f[Mx1][Mx1],gcd[Mx1][Mx1],mul[Mx1][Mx1];
- int cnt,ans,pri[Mx2],tmp[Mx2],g[Mx2],b[Mx1];
- bool jud[Mx2];
- inline void pre()
- {
- sum[n]=;
- for(int i=;i<=n;i++)
- {
- for(int j=;j<=n;j++)
- {
- if(i==||j==) f[i][j]=;
- else if(i==j) f[i][j]=(f[i][j-]+)%p;
- else if(i<j) f[i][j]=f[i][j-];
- else f[i][j]=(f[i-j][j]+f[i][j-])%p;
- }
- sum[n-i]=f[i][i];
- }
- g[]=,g[]=;
- for(int i=;i<=1e7;i++)
- {
- if(!jud[i]) pri[++cnt]=tmp[i]=i,g[i]=(*i-)%p;
- for(int j=;j<=cnt&&i*pri[j]<=1e7;j++)
- {
- jud[i*pri[j]]=;
- if(i%pri[j])
- tmp[i*pri[j]]=pri[j],
- g[i*pri[j]]=g[i]*g[pri[j]]%p;
- 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]]%p;
- else g[i*pri[j]]=(1LL*g[i]*pri[j]+i*pri[j]-i)%p;
- break;
- }
- }
- }
- for(int i=;i<=n;i++) gcd[i][]=gcd[][i]=gcd[i][i]=i,gcd[][i]=gcd[i][]=;
- for(int i=;i<=n;i++)
- for(int j=;j<=i;j++)
- {
- if(!gcd[i][j]) gcd[i][j]=gcd[j][i-j];
- gcd[j][i]=gcd[i][j];
- }
- for(int i=;i<=n;i++)
- {
- mul[i][]=;
- for(int j=;j<=n;j++) mul[i][j]=(1LL*mul[i][j-]*i)%K;
- }
- }
- inline int F(int pi,int pj)
- {
- if(tp==) return %K;
- if(tp==) return (gcd[pi][pj])%K;
- if(tp==) return (mul[pi][pj]+mul[pj][pi]+(pi^pj))%K;
- }
- inline void mod(int &x,const int &y){
- x+=y;
- if (x>=p) x-=p;
- }
- int Cnt[Mx2];
- int main()
- {
- scanf("%d%d%d",&tp,&n,&K);
- for(int i=;i<K;i++) scanf("%d",&a[i]);
- pre();
- for(int i=;i<=n;i++)
- for(int j=i+;j<=n-i;j++)
- for(int muli=;muli*i+j<=n;muli++)
- for(int mulj=;mulj*j+muli*i<=n;mulj++)
- mod(Cnt[F(i,j)],sum[muli*i+mulj*j]);
- for(int i=;i<K;i++) ans+=1LL*g[a[i]]*Cnt[i]%p,ans%=p;
- for(int i=;i<=n;i++)
- {
- for(int muli=;muli*i<=n;muli++)
- {
- int Tmp=1LL*muli*(muli-)/*(sum[muli*i]-sum[(muli+)*i]+p)%p;
- mod(ans,1LL*g[a[F(i,i)]]*Tmp%p);
- }
- }
- cout<<ans<<endl;
- return ;
- }
bzoj4772 显而易见的数论的更多相关文章
- [BZOJ4772]显而易见的数论(数论)
4772: 显而易见的数论 Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 76 Solved: 32[Submit][Status][Discuss ...
- bzoj 4772 显而易见的数论——拆分数(五边形数定理)+线性筛
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4772 题解:https://blog.csdn.net/Dream_Lolita/artic ...
- 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 ...
- 卡特兰数 Catalan数 ( ACM 数论 组合 )
卡特兰数 Catalan数 ( ACM 数论 组合 ) Posted on 2010-08-07 21:51 MiYu 阅读(13170) 评论(1) 编辑 收藏 引用 所属分类: ACM ( 数论 ...
- 简单数论总结1——gcd与lcm
并不重要的前言 最近学习了一些数论知识,但是自己都不懂自己到底学了些什么qwq,在这里把知识一并总结起来. 也不是很难的gcd和lcm 显而易见的结论: 为什么呢? 根据唯一分解定理: a和b都可被分 ...
- Mobius反演与积性函数前缀和演学习笔记 BZOJ 4176 Lucas的数论 SDOI 2015 约数个数和
下文中所有讨论都在数论函数范围内开展. 数论函数指的是定义域为正整数域, 且值域为复数域的函数. 数论意义下的和式处理技巧 因子 \[ \sum_{d | n} a_d = \sum_{d | n} ...
- [E. Ehab's REAL Number Theory Problem](https://codeforces.com/contest/1325/problem/E) 数论+图论 求最小环
E. Ehab's REAL Number Theory Problem 数论+图论 求最小环 题目大意: 给你一个n大小的数列,数列里的每一个元素满足以下要求: 数据范围是:\(1<=a_i& ...
- 【题解】localmaxima 数论
# T749 localmaxima 权限限制没有超链接 题目描述 Description 给出一个排列,若其中一个数比它前面的数都大,则称为localmaxima数,求一个随机排列中localmax ...
- Codeforces Round #382 Div. 2【数论】
C. Tennis Championship(递推,斐波那契) 题意:n个人比赛,淘汰制,要求进行比赛双方的胜场数之差小于等于1.问冠军最多能打多少场比赛.题解:因为n太大,感觉是个构造.写写小数据, ...
随机推荐
- Hibernate无法提取结果集
原因:表结构错误或 与 映射文件不一致 org.springframework.dao.InvalidDataAccessResourceUsageException: could not extra ...
- MySQL5.6基于GTID的主从复制配置
全局事务标示符(Global Transactions Identifier)是MySQL 5.6复制的一个新特性. GTID实际上是由UUID+TID组成的.其中UUID是一个MySQL实例的唯一标 ...
- 采坑笔记——mysql的order by和limit排序问题
背景说明 今天写出一个十分弱智的bug,记录一下,提醒自己以后别这种犯错,不怕丢人哈~ 在写一个分页查询记录的sql时,要根据添加的时间逆序分页输出,之前的写法是酱紫 select record.a, ...
- Uva12230Crossing Rivers 数学
Uva12230Crossing Rivers 问题: You live in a village but work in another village. You decided to follow ...
- POJ 2676 数独(DFS)
Sudoku Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 21612 Accepted: 10274 Specia ...
- SpringMVC使用注解@RequestMapping映射请求
pringMVC通过使用@RequestMapping注解,实现指定控制器可以处理哪些URL请求. 控制器的类定义及方法定义处都可以标注@RequestMapping: 类定义处:提供初步的请求映射信 ...
- 吴恩达DeepLearning 第一课第四周随笔
第四周 4.1深度神经网络符号约定 L=4______(神经网络层数) 4.2 校正矩阵的维数 校正要点:,, dZ,dA,dW,db都与它们被导数(Z,A,W,b)的维数相同 4.3 为什么使用 ...
- POJ:2449-Remmarguts' Date(单源第K短路)
Remmarguts' Date Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 33081 Accepted: 8993 Des ...
- 笔记-HTTP及HTTPS
笔记-HTTP及HTTPS 1. HTTP 1.1. 简介 HTTP:hyper text transfer protocol 超文本传输协议 http常用请求方式,method ge ...
- mysql in和exists性能比较和使用【转】
exists对外表用loop逐条查询,每次查询都会查看exists的条件语句,当 exists里的条件语句能够返回记录行时(无论记录行是的多少,只要能返回),条件就为真,返回当前loop到的这条记录, ...