【CF653G】Move by Prime

题意:给你一个长度为n的数列$a_i$,你可以进行任意次操作:将其中一个数乘上或者除以一个质数。使得最终所有数相同,并使得操作数尽可能小。现在我们想要知道$a_i$的所有子序列的操作数之和是多少。答案对$10^9+7$取模。

$n,a_i\le 3\times 10^5$

题解:显然要对每个质数分别处理。而对于每个质数,最终一定是让所有数都变成该序列的中位数最优。因此如果所有数的次数分别是$k_1,k_2...k_n$,则如果i在中位数左边,则贡献为$-k_i$,否则贡献为$k_i$。那么我们只需要知道有多少子序列满足i在中位数左边/有边就行了。

考虑如下生成函数:

$(1+{1\over x})^{i-1}(1+x)^{n-i}={(1+x)^{n-1}\over x^{i-1}}$

它的意义显然是:$x^j$的系数等于i右面的数比左面的数多j的方案数。显然我们要的就是所有j为正的系数-所有j为负的系数。显然就是:

$\sum\limits_{j=i}^nC_{n-1}^j-\sum\limits_{j=0}^{i-2}C_{n-1}^j$

维护个组合数的前缀和就好了。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
const int maxn=300010;
typedef long long ll;
const ll P=1000000007;
int n,num;
ll ans;
int pri[maxn],vis[maxn];
ll s[maxn],ine[maxn],jc[maxn],jcc[maxn];
vector<int> v[maxn];
vector<int>::iterator it;
inline ll c(int a,int b)
{
if(a<b) return 0;
return jc[a]*jcc[b]%P*jcc[a-b]%P;
}
inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-') f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+(gc^'0'),gc=getchar();
return ret*f;
}
int main()
{
n=rd();
int i,j,t;
for(i=1;i<=n;i++)
{
t=rd();
for(j=2;j*j<=t;j++) if(t%j==0)
{
if(!vis[j]) pri[++num]=j,vis[j]=num;
int tmp=0;
while(t%j==0) t/=j,tmp++;
v[vis[j]].push_back(tmp);
}
if(t!=1)
{
if(!vis[t]) pri[++num]=t,vis[t]=num;
v[vis[t]].push_back(1);
}
}
ine[0]=ine[1]=jc[0]=jc[1]=jcc[0]=jcc[1]=1;
for(i=2;i<=n;i++) ine[i]=P-(P/i)*ine[P%i]%P,jc[i]=jc[i-1]*i%P,jcc[i]=jcc[i-1]*ine[i]%P;
s[0]=1;
for(i=1;i<n;i++) s[i]=(s[i-1]+c(n-1,i))%P;
for(i=1;i<=num;i++)
{
int k=n-v[i].size();
sort(v[i].begin(),v[i].end());
for(it=v[i].begin();it!=v[i].end();it++)
{
k++;
ans=(ans+(*it)*(((k==1)?0:s[k-2])-s[n-1]+s[k-1]))%P;
}
}
printf("%lld",ans);
return 0;

最新文章

  1. (六)Maven之pom.xml文件简单说明
  2. preventDefault()方法
  3. linux tar.gz
  4. asp.net使用My97 Date Picker时设置默认起始时间为n年之前的今天
  5. dbvis MySQL server version for the right syntax to use near &#39;OPTION SQL_SELECT_LIMIT=DEFAULT&#39; at line 1
  6. Linux里如何查找文件内容
  7. asp.net webform 与mvc 共享session
  8. Ubuntu14.10下解决chromium浏览器无法安装adobe flash的问题
  9. C++细节系列(零):零散记录
  10. 2.MyBatis有代理增删改
  11. 自定义分布式RESTful API鉴权机制
  12. LeetCode 455. Assign Cookies (分发曲奇饼干)
  13. js switch 用法
  14. Android ANR的产生与分析
  15. PNG,JPEG,BMP,JIF图片格式详解及其对比
  16. .NET Core 全新认识
  17. MYSQL中利用select查询某字段中包含以逗号分隔的字符串的记录方法
  18. python 之九九乘法表
  19. 解决 hibernate cannot define positional parameter after any named parameters have been defined
  20. 新增检查sql脚本是否符合ANSI编码格式

热门文章

  1. 生成asm-offset
  2. spring mvc 框架URL接收中文参数的乱码解决方案
  3. 5 云计算系列之glance镜像服务安装
  4. Lua常用时间函数
  5. Windbg在软件调试中的应用
  6. office转换成pdf
  7. [原]unity3D bug记录
  8. [Arch] 03. Practice UML in project
  9. AndroidManifest详解
  10. xcode 5.1打包iOS 7.1应用问题笔记