【51Nod1769】Clarke and math2(数论,组合数学)
【51Nod1769】Clarke and math2(数论,组合数学)
题面
题解
考虑枚举一个\(i_k\),枚举一个\(i\),怎么计算\(i_k\)对\(i\)的贡献。
把\(\frac{i}{i_k}\)拆掉,维护一个长度为\(k\)的数组,表示\(\frac{i_{k-1}}{i_{k}}\),对于每一个质因子,假设其出现次数为\(a\),那么就是把\(a\)个元素放进\(k\)个盒子里,盒子可以空,这个的方案数是\({a+k-1\choose k-1}={a+k-1\choose a}\),不难发现\(a\)很小,所以可以直接\(O(a)\)暴力算。
于是我们提前对于每一个\(a\)算出方案数,然后提前把质因数分解好,就可以做到\(O(nlogn)\)了。
#include<iostream>
#include<cstdio>
using namespace std;
#define MOD 1000000007
#define MAX 500500
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=(x*10ll+ch-48)%MOD,ch=getchar();
return t?-x:x;
}
int n,K,C[25],f[MAX],g[MAX],x[MAX],v[MAX],inv[25];
int main()
{
n=read();K=read();
for(int i=1;i<=n;++i)f[i]=read();
inv[0]=inv[1]=1;for(int i=2;i<=20;++i)inv[i]=1ll*inv[MOD%i]*(MOD-MOD/i)%MOD;
for(int i=1;i<=20;++i)inv[i]=1ll*inv[i-1]*inv[i]%MOD;
for(int a=0;a<=20;++a)
{
int nw=(a+K-1)%MOD;C[a]=inv[a];
for(int i=0;i<a;++i)C[a]=1ll*C[a]*(nw-i+MOD)%MOD;
}
for(int i=1;i<=n;++i)x[i]=i,v[i]=1;
for(int i=2;i<=n;++i)
if(x[i]!=1)
for(int j=i;j<=n;j+=i)
{
int a=0;
while(x[j]%i==0)++a,x[j]/=i;
v[j]=1ll*v[j]*C[a]%MOD;
}
for(int i=1;i<=n;++i)
for(int j=i;j<=n;j+=i)
g[j]=(g[j]+1ll*f[i]*v[j/i])%MOD;
for(int i=1;i<=n;++i)printf("%d ",g[i]);
puts("");return 0;
}
【51Nod1769】Clarke and math2(数论,组合数学)的更多相关文章
- 【51Nod 1769】Clarke and math2
[51Nod 1769]Clarke and math2 题面 51Nod 题解 对于一个数论函数\(f\),\(\sum_{d|n}f(d)=(f\times 1)(n)\). 其实题目就是要求\( ...
- 51Nod 1769 Clarke and math2
51Nod 1769 Clarke and math2 http://www.51nod.com/Challenge/Problem.html#!#problemId=1769 要算的是\(G=F*I ...
- 数论 - 组合数学 + 素数分解 --- hdu 2284 : Solve the puzzle, Save the world!
Solve the puzzle, Save the world! Problem Description In the popular TV series Heroes, there is a ta ...
- HDU 4497 数论+组合数学
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4497 解题思路:将满足条件的一组x,z,y都除以G,得到x‘,y',z',满足条件gcd(x',y' ...
- Uva 11076 Add Again (数论+组合数学)
题意:给你N个数,求把他们的全排列加和为多少 思路:对于这道题,假设数字k1在第一位,然后求出剩下N-1位的排列数num1,我们就可以知道k1在第一位时 排列有多少种为kind1, 同理,假设数字k2 ...
- Codeforces Round #447 (Div. 2) B. Ralph And His Magic Field【数论/组合数学】
B. Ralph And His Magic Field time limit per test 1 second memory limit per test 256 megabytes input ...
- Codeforces 223C Partial Sums 数论+组合数学
题意非常easy,求不是那么好求的,k非常大 要操作非常多次,所以不可能直接来的.印象中解决操作比較多无非线段树 循环节 矩阵 组合数等等吧,这道题目 也就仅仅能多画画什么 的了 就以第一个案例为主吧 ...
- 51nod1769 Clarke and math 2
题目 实际上就是要求\(f*I^k\). 因为\(I^k\)是一个积性函数,所以我们只需要考虑如何求\(I^k(p^a)\). 把这个东西转化成一个长度为\(k\)的序列,每一位是\(\frac{i_ ...
- P3270 [JLOI2016]成绩比较 容斥 数论 组合数学 拉格朗日插值
LINK:成绩比较 大体思路不再赘述 这里只说几个我犯错的地方. 拉格朗日插值的时候 明明是n次多项式 我只带了n个值进去 导致一直GG. 拉格朗日插值的时候 由于是从1开始的 所以分母是\((i-1 ...
随机推荐
- <挑战程序设计竞赛> poj 3320 Jessica's Reading Problem 双指针
地址 http://poj.org/problem?id=3320 解答 使用双指针 在指针范围内是否达到要求 若不足要求则从右进行拓展 若满足要求则从左缩减区域 代码如下 正确性调整了几次 然后 ...
- celery beat - 心跳包
celery -A 项目名 beat -l info -S django# 启动心跳任务 celery -A 项目名 worker -l info # 启动1个worker去执行
- mpvue快速入门
主要特性 使用 mpvue 开发小程序,你将在小程序技术体系的基础上获取到这样一些能力: 彻底的组件化开发能力:提高代码复用性 完整的 Vue.js 开发体验 方便的 Vuex 数据管理方案:方便构建 ...
- 发布一个简单的npm包
本文简单地记录了发布一个简单npm包的过程,以便后续参考使用. 初始化npm init 通过npm init创建一个package.json文件 D:\robin\lib\weapp-utils> ...
- ros2中创建一个python package
完整的python package的目录结构如下: source /opt/ros/dashing/setup.bash cd ros2_ws/src && ros2 pkg crea ...
- Unix 开发中的 Make 三连
Unix 开发过程中,经常性的操作是从源码编译安装相应库文件,所以下面三个命令便是家常便饭,俗称三连: ./configure make make install 下面来看看这三步分别做了什么. co ...
- Selenium(十):用By定位元素、鼠标事件、键盘事件
1. 用By定位元素 除了前面介绍的单位方法,WebDriver还提供了另外一套写法,即统一调用find_element()方法,通过By来声明定位的方法,并且传入对应定位方法的定位参数.具体如下: ...
- ES6中Class的用法及在微信小程序中的应用实例
1.ES6的基本用法 ES6 提供了更接近传统语言的写法,引入了 Class(类)这个概念,作为对象的模板.通过class关键字,可以定义类.基本上,ES6 的class可以看作只是一个语法糖,它的绝 ...
- 2-2 远程管理命令-网卡和IP地址的概念
02.查看或配置网卡信息 序号 命令 对应英文 作用 01 ifconfig configure a network interface 查看/配置计算机当前的网卡配置信息 02 ping ip地址 ...
- Linux下基于shell脚本实现学生信息管理系统
#该管理系统是参考两位博主(时间有点远了,我忘了,请博主看到后联系我)后自行修改添加的.登录过程还有很多不完善,我就抛砖引玉啦. 废话不多,直接上码! #!/bin/bash# 学生管理系统# @ve ...