一、题目

题目描述

定义一个整数拆分序列 \(a\) 的权值为:

\[\sum_{i=1}^n\sum_{j=1}^{i-1}\gcd(a_i,a_j)
\]

求对于一个整数 \(n\) 所有整数拆分序列的权值和模 \(1e9+7\) 的值,有 \(m\) 个数不能选。

数据范围

\(n,m\leq2000\),多组数据

二、解法

法一

见到 \(\gcd\) 就用莫比乌斯反演,问题变成了求 \(i\) 倍数有 \(x\) 个的整数拆分个数。

暴力完全背包是 \(O(n^3\log n)\) 的,瓶颈在于加入那些贡献为 \(0\) 的数,所以可以做一个退背包,时间复杂度 \(O(n^2\log^2n)\),这种做法我讲得比较简略因为他是没有前途的(主要是告诉你完全背包也是可以退的)

法二

正解是算贡献(这么强的东西怎么我学不会啊!)

具体来说我们统计每对 \((a_i,a_j)\) 的贡献,首先要算一个 \(f[i]\) 表示去掉不能选的数后 \(i\) 的整数拆分个数,这个东西暴力算是 \(O(n^2)\) 的。

然后考虑对于一个拆分序列统计值 \(x\) 和值 \(y\) 之间的贡献,设这个拆分序列的 \(x\) 数量是 \(a\),\(y\) 的数量是 \(b\),那么我们肯定要让 \(\gcd(x,y)\) 被统计 \(a\times b\) 次,但是在真实的计算中我们是不知道 \(a,b\) 的,只能尝试用 \(f\) 去表示它,我们枚举 \(i,j\) 表示 \(x\) 钦定选 \(i\) 个,\(y\) 钦定选 \(j\) 个,那么我们要在 \(i\in[1,a],j\in[1,b]\) 的时候统计一次就可以了,所以贡献算出来是这样的:

稍微解释一下这个钦定,其实它是一个很重要的概念,就表示强制选某些另一些乱选的情况

\[\sum_{x,y,i,j}\gcd(x,y)\times f(n-ix-iy)
\]

算贡献的魅力就在于:就算你不知道一些东西,但是他依然是可以统计的

这个东西肯定不能暴力算,有一个比较小清新的优化,设 \(t=ix\),求出 \(c[t][y]\) 表示 \(\sum f(n-t-jy)\),根据调和级数求和的理论不难发现求出这个东西是 \(O(n^2\log n)\) 的,然后暴力枚举 \(x,y\) 和 \(x\) 的所有倍数,同样是调和级数的 \(O(n^2\log n)\)

白嫖了一个好看的代码:

#include<bits/stdc++.h>
#define maxn 2005
using namespace std;
const int mod = 1e9+7;
int n,m,ans,a[maxn],g[maxn][maxn],f[maxn],c[maxn][maxn];
bool ban[maxn];
inline int add(int x,int y){return (x+=y)>=mod?x-mod:x;}
int main()
{
freopen("zscf.in","r",stdin);
freopen("zscf.out","w",stdout);
for(int i=1;i<=2000;i++)
for(int j=i;j<=2000;j++)
g[i][j]=g[j][i]=__gcd(i,j);
while(~scanf("%d%d",&n,&m)){
memset(ban,0,n+1),ans=0;
for(int i=1,x;i<=m;i++) scanf("%d",&x),ban[x]=1;
memset(f,0,(n+1)<<2),f[0]=1;
for(int i=1;i<=n;i++) if(!ban[i])
for(int j=i;j<=n;j++)
f[j]=add(f[j],f[j-i]);
for(int j=1;j<=n;j++) if(!ban[j])
for(int i=n;i>=1;i--)
if(i+j<=n) c[i][j]=add(c[i+j][j],f[n-i-j]);
else c[i][j]=0;
for(int i=1;i<=n;i++) if(!ban[i]){
int cnt=0;
for(int x=1,s=i;s<=n;s+=i,x++){
if(s+i<=n) cnt=add(cnt,1ll*x*f[n-s-i]%mod);
for(int j=1;j<i;j++) if(!ban[j])
ans=add(ans,1ll*g[i][j]*c[s][j]%mod);
}
ans=add(ans,1ll*cnt*i%mod);
}
printf("%d\n",ans);
}
}

[unknown source] 整数拆分的更多相关文章

  1. HDU 4651 Partition(整数拆分)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4651 题意:给出n.求其整数拆分的方案数. i64 f[N]; void init(){    f[0 ...

  2. android百度地图打包混淆 用不了No such file or directory (2) com.baidu.mapapi.BMapManager.init(Unknown Source)

    调用了百度地图地图开发包是baidumapapi_v2_1_1.jar,定位SDK版本是locSDK_3.3.jar 调试的时候能运行!可是打包签名后就运行不了! baidu  google 了好久! ...

  3. LightOJ 1336 Sigma Function(数论 整数拆分推论)

    --->题意:给一个函数的定义,F(n)代表n的所有约数之和,并且给出了整数拆分公式以及F(n)的计算方法,对于一个给出的N让我们求1 - N之间有多少个数满足F(x)为偶数的情况,输出这个数. ...

  4. LightOJ 1341 Aladdin and the Flying Carpet(整数拆分定理)

    分析:题目并不难理解,就是一些细节上的优化需要我们注意,我在没有优化前跑了2000多MS,优化了一些细节后就是400多MS了,之前还TLE了好几次. 方法:将整数拆分为质因子以后,表达为这样的形式,e ...

  5. java.lang.NullPointerException at java.lang.ProcessBuilder.start(Unknown Source) at org.apache.hadoop.util.Shell.runCommand(Shell.java:482)

    1:问题出现的原因,部署好的hadoop-2.6.4进行window10操作hadoop api出现的错误,具体错误是我向hdfs上传文件,还好点,之前解决过,这里不叙述,这里说一下从hdfs下载文件 ...

  6. Exception in thread "main" java.lang.StackOverflowError at java.util.ArrayList$SubList.rangeCheckForAdd(Unknown Source)

    Exception in thread "main" java.lang.StackOverflowError at java.util.ArrayList$SubList.ran ...

  7. HDU1028 (整数拆分)

    Ignatius and the Princess III Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K ...

  8. 整数拆分问题_C++

    一.问题背景  整数拆分,指把一个整数分解成若干个整数的和 如 3=2+1=1+1+1  共2种拆分 我们认为2+1与1+2为同一种拆分 二.定义 在整数n的拆分中,最大的拆分数为m,我们记它的方案数 ...

  9. 解决myeclipse10.x的Servers产生的at com.genuitec.eclipse.ast.deploy.core.Deployment.<init>(Unknown Source)错

    错误: java.lang.NullPointerException at com.genuitec.eclipse.ast.deploy.core.Deployment.<init>(U ...

随机推荐

  1. Shell 元字符 & 变量

    Shell 介绍 ## 什么是程序 程序就是一组数据和代码逻辑集合的文件 ## 什么是进程 进程是程序的运行过程,也可以说是操作系统干活的过程,因为是操作系统负责控制硬件来运行应用程序 ps:进程与进 ...

  2. SSH 密钥认证

    目录 SSH协议概述 SSH 和 Telnet 的区别 SSH 相关命令 SSH 验证方式 基于密钥的安全认证 SSH 优化 expect 脚本免交互登录 sshpass 免交互登录 SSH协议概述 ...

  3. 如何实现批量上传----------Java解析excel

    一.引子 在web平台开发中仅经常会遇到一下需要批量的问题,通常得做法是使用excel上传,下面主要介绍一下在实际开发中到的实例. 二.准备工作 1.需要导入的jar包(主要用到poi包) (1)po ...

  4. WOJ1024 (POJ1985+POJ2631) Exploration 树/BFS

    title: WOJ1024 (POJ1985+POJ2631) Exploration 树/BFS date: 2020-03-20 10:43:00 categories: acm tags: [ ...

  5. nyoj-1236 挑战密室

    挑战密室 时间限制:1 s | 内存限制:128 M 提交 状态 排名 题目描述 R组织的特工Dr. Kong 为了寻找丢失的超体元素,不幸陷入WTO密室.Dr. Kong必须尽快找到解锁密码逃离,否 ...

  6. Netty(五)Netty 高性能之道

    4.背景介绍 4.1.1 Netty 惊人的性能数据 通过使用 Netty(NIO 框架)相比于传统基于 Java 序列化+BIO(同步阻塞 IO)的通信框架,性能提升了 8 倍多.事 实上,我对这个 ...

  7. POJ 2778 DNA Sequence(AC自动机 + 矩阵快速幂)题解

    题意:给出m个模式串,要求你构造长度为n(n <= 2000000000)的主串,主串不包含模式串,问这样的主串有几个 思路:因为要不包含模式串,显然又是ac自动机.因为n很大,所以用dp不太好 ...

  8. STM32 单片机的USART的奇偶校验 误区(坑)

    当STM32的串口配置成带有奇偶校验位的情况下,需要软件校验是否发生奇偶校验错误,硬件只是置起奇偶校验错误标志位,并将错误的数据放到DR寄存器中,同时置起RXEN标志位,如果使能中断还是会正常进入中断 ...

  9. Linux bash script regex auto replace

    Linux bash script regex auto replace 自动替换 /assets/css/0.styles.96df394b.css => ./assets/css/0.sty ...

  10. SVG background watermark

    SVG background watermark SVG 背景水印 <svg xmlns="http://www.w3.org/2000/svg" width="2 ...