bzoj 4772 显而易见的数论——拆分数(五边形数定理)+线性筛
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4772
题解:https://blog.csdn.net/Dream_Lolita/article/details/82314788
关于 \( g[p^t] \) 的值是多少,提供自己的见解:
首先,和 \( p^t \) 互质的数有 \( p^{t-1} \) 段,每段有 \( p-1 \) 个,模 p 等于 1 ~ p-1 。
那么和 \( p^t \) 做 gcd 的就是 \( p^{t-1} \) 段模 p 等于 0 ~ p-2 的数。
把模 p 等于 1 ~ p-2 的数的贡献写在一起,就是 \( p^{t-1}*(p-2) \) ;
考虑剩下的那些 0 , p , 2p , 3p , ...... pt-1*p ,那个 0 在这道题里可以写成 pt 。
考虑 gcd 里贡献 p 的,有 \( p^{t-1} - p^{t-2} \) 个;贡献 p2 的,有 \( p^{t-2} - p^{t-3} \) 个,以此类推。
所以贡献就是 \( p*( p^{t-1} - p^{t-2} ) + p^2*( p^{t-2} - p^{t-3} ) + ... + p^{t-1}*( p^1 - p^0 ) + p^t \)
乘开就是 \( ( p^t - p^{t-1} ) + ( p^t - p^{t-1} ) + ... + ( p^t - p^{t-1} ) + p^t = (t-1)*( p^t - p^{t-1} ) + p^t \)
所以 \( g[p^t] = p^{t-1}*(p-2) + (t-1)*(p^t - p^{t-1}) + p^t \)
如果想把 \( g[p^{t-1}] \) 代入式子里,就会变成:
\( g[p^{t-1}]=p^{t-2} + (t-2)*(p^{t-1} - p^{t-2}) + p^t-1 \)
\( g[p^t] = p*g[p^{t-1}]+(p^t - p^{t-1}) \)
筛的时候可以记录一下 mindiv 的 p 是 p 的几次方,就可以方便地知道 i 是不是 \( p^t \) 或者 i 是由哪个互质的数乘起来的了。
注意异或运算要加括号。
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
int rdn()
{
int ret=;bool fx=;char ch=getchar();
while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return fx?ret:-ret;
}
int Mx(int a,int b){return a>b?a:b;}
int Mn(int a,int b){return a<b?a:b;}
const int N=,M=1e5+,M2=1e7+,mod=1e9+;
int upt(int x,int md=mod){while(x>=md)x-=md;while(x<)x+=md;return x;}
int pw(int x,int k,int md=mod)
{int ret=;while(k){if(k&)ret=(ll)ret*x%md;x=(ll)x*x%md;k>>=;}return ret;} int type,n,k,a[M],f[N][N],g[M2],pri[M2],mdv[M2];
int p[N],nm[N][N],ct[M],jc[N],jcn[N]; bool vis[M2];
int gcd(int a,int b){return b?gcd(b,a%b):a;}
bool flag=;
int F(int x,int y)
{
if(type==)return ;
else if(type==)return gcd(x,y);
else return upt(pw(x,y,k)+pw(y,x,k)+(x^y),k);//(x^y) token!!!
}
int C(int n,int m){return (ll)jc[n]*jcn[m]%mod*jcn[n-m]%mod;}
void init(int mx)
{
p[]=;
for(int i=;i<=n;i++)
for(int j=;;j++)
{
int k0=j*(*j-)>>, k1=j*(*j+)>>;
int fx=(j&)?:-;
if(k0>i&&k1>i)break;
if(k0<=i)p[i]=upt(p[i]+fx*p[i-k0]);
if(k1<=i)p[i]=upt(p[i]+fx*p[i-k1]);
} jc[]=;for(int i=;i<=n;i++)jc[i]=(ll)jc[i-]*i%mod;
jcn[n]=pw(jc[n],mod-,mod);
for(int i=n-;i>=;i--)jcn[i]=(ll)jcn[i+]*(i+)%mod;
for(int i=;i<=n;i++)
for(int j=n-i;j>=i;j--)
{
int ret=;
if(j==i)
{
for(int k=;k*i<=n;k++)
{
int tmp=upt(p[n-k*i]-((k+)*i<=n?p[n-(k+)*i]:));
ret=(ret+(ll)C(k,)*tmp)%mod;
}
}
else
{
for(int k0=,d0=i;d0+j<=n;k0++,d0+=i)
for(int k1=,d1=j;d0+d1<=n;k1++,d1+=j)
ret=upt(ret+p[n-d0-d1]);
}
int d=F(i,j)%k; ct[d]=upt(ct[d]+ret);
} int cnt=; g[]=;
for(int i=;i<=mx;i++)
{
if(!vis[i])g[i]=upt(*i-),pri[++cnt]=i,mdv[i]=i;
for(int j=,d;j<=cnt&&(d=i*pri[j])<=mx;j++)
{
vis[d]=; int p=pri[j];
if(i%pri[j]==)
{
mdv[d]=mdv[i]*p;
if(mdv[d]==d)g[d]=((ll)g[i]*p+d-i)%mod;
else g[d]=(ll)g[d/mdv[d]]*g[mdv[d]]%mod;
break;
}
g[d]=(ll)g[i]*g[p]%mod; mdv[d]=p;
}
}
}
int main()
{
type=rdn();n=rdn();k=rdn(); int mx=;
for(int i=;i<k;i++)a[i]=rdn(),mx=Mx(mx,a[i]);
init(mx); int ans=;
for(int i=;i<k;i++)
ans=(ans+(ll)g[a[i]]*ct[i])%mod;
printf("%d\n",ans); return ;
}
bzoj 4772 显而易见的数论——拆分数(五边形数定理)+线性筛的更多相关文章
- Bzoj 2186: [Sdoi2008]沙拉公主的困惑 乘法逆元,线性筛,欧拉函数,数论
2186: [Sdoi2008]沙拉公主的困惑 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 2560 Solved: 857[Submit][St ...
- BZOJ2186 [Sdoi2008]沙拉公主的困惑 【数论,欧拉函数,线性筛,乘法逆元】
2186: [Sdoi2008]沙拉公主的困惑 Time Limit: 10 Sec Memory Limit: 259 MB Submit: 5003 Solved: 1725 [Submit] ...
- [BZOJ4772]显而易见的数论(数论)
4772: 显而易见的数论 Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 76 Solved: 32[Submit][Status][Discuss ...
- BZOJ 2190 仪仗队(线性筛欧拉函数)
简化题意可知,实际上题目求得是gcd(i,j)=1(i,j<=n)的数对数目. 线性筛出n大小的欧拉表,求和*2+1即可.需要特判1. # include <cstdio> # in ...
- hdu 4651 Partition(整数拆分+五边形数)
Partition Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- BZOJ 4833: [Lydsy1704月赛]最小公倍佩尔数(数论 + 最值反演)
题面 令 \({(1+\sqrt 2)}^n=e(n)+f(n)*\sqrt2\) ,其中 \(e(n),f(n)\) 都是整数,显然有 \({(1-\sqrt 2)}^n=e(n)-f(n)*\sq ...
- Mobius反演与积性函数前缀和演学习笔记 BZOJ 4176 Lucas的数论 SDOI 2015 约数个数和
下文中所有讨论都在数论函数范围内开展. 数论函数指的是定义域为正整数域, 且值域为复数域的函数. 数论意义下的和式处理技巧 因子 \[ \sum_{d | n} a_d = \sum_{d | n} ...
- 卡特兰数 Catalan数 ( ACM 数论 组合 )
卡特兰数 Catalan数 ( ACM 数论 组合 ) Posted on 2010-08-07 21:51 MiYu 阅读(13170) 评论(1) 编辑 收藏 引用 所属分类: ACM ( 数论 ...
- [BZOJ 3930] [CQOI 2015]选数(莫比乌斯反演+杜教筛)
[BZOJ 3930] [CQOI 2015]选数(莫比乌斯反演+杜教筛) 题面 我们知道,从区间\([L,R]\)(L和R为整数)中选取N个整数,总共有\((R-L+1)^N\)种方案.求最大公约数 ...
随机推荐
- Mac安装fish shell
1.brew update 2.brew install fish 3.sudo vi /etc/shells 增加内容:/usr/local/bin/fish ##增加fish到shell环境变 ...
- 线程同步,条件变量pthread_cond_wait
与互斥锁不同,条件变量是用来等待而不是用来上锁的.条件变量用来自动阻塞一个线程,直到某特殊情况发生为止.条件变量使我们可以睡眠等待某种条件出现.条件变量是利用线程间共享的全局变量进行同步的一种机制,主 ...
- 弹出层小插件之(二) layer&layui
其实layer或者layui相对于上次所说的 sweetalert来说不仅仅有弹出层,它有很多的功能,这也大大的提高了我们的开发效率,根据我们项目的实际需要的效果进行选择.下面介绍下Layer的用法吧 ...
- Python3 urllib抓取指定URL的内容
最近在研究Python,熟悉了一些基本语法和模块的使用:现在打算研究一下Python爬虫.学习主要是通过别人的博客和自己下载的一下文档进行的,自己也写一下博客作为记录学习自己过程吧.Python代码写 ...
- python 安装包查看
pip freeze可以查看已经安装的python软件包和版本 pip list 也可以
- 关于 lerp();
value lerp(value s, value a, value b ); 该函数返回的值为:a + s * (b - a) ,是一个处于 [a, b] 之间的值. 当s=0, 该函数返回a :当 ...
- http请求报头
客户请求的处理:Http请求报头 创建高效servlet的关键之一,就是要了解如何操纵超文本传输协议(HypeText TransferProtocol, HTTP). HTTP请求报头不同于前一章的 ...
- spring核心容器
容器:用来包装或装载物品的储存器 web服务器与jsp.servlet的关系: 从程序文件存放的位置 程序文件要放到web服务器上 从程序执行的方式 程序的从初始化到消亡都是web服务器管理的 从以 ...
- JDBC事务控制管理(转载)
JDBC事务控制管理 转载于 2018年01月26日 15:46:11 1.事务 (1)事务的概念 事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功. 例如:A——B转帐, ...
- magento的布局文件之谜
magento的布局文件layout.xml文件详解 解析顺序 布局xml文件一般位于app/design/{area}/{package}/{theme}/layout/目录下.Layout文件一般 ...