Clarke and math

题目连接:

http://acm.hdu.edu.cn/showproblem.php?pid=5628

Description

Clarke is a patient with multiple personality disorder. One day, he turned into a mathematician, did a research on interesting things.

Suddenly he found a interesting formula. Given f(i),1≤i≤n, calculate

g(i)=∑i1∣i∑i2∣i1∑i3∣i2⋯∑ik∣ik−1f(ik) mod 1000000007(1≤i≤n)

Input

The first line contains an integer T(1≤T≤5), the number of test cases.

For each test case, the first line contains two integers n,k(1≤n,k≤100000).

The second line contains n integers, the ith integer denotes f(i),0≤f(i)<109+7.

Output

For each test case, print a line contained n integers, the ith integer represents g(i).

Sample Input

2

6 2

2 3 3 3 3 3

23 3

2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3

Sample Output

2 7 7 15 7 23

2 9 9 24 9 39 9 50 24 39 9 102 9 39 39 90 9 102 9 102 39 39 9

Hint

题意

题解:

dp

dp[i][j]表示第i位置,选择了j个不同的因子之后,能够获得的权值是多少

ans[i]=sigma C(k,j)*dp[i][j]

为什么呢?

我们考虑传递了k次的sigma,实际上就是在枚举因子,在这个数据范围内,最多枚举20个不同的因子,而且因子显然是不断递减的(当然,这句话没什么用

然后脑补脑补,这个就是对的了……

官方题解确实看不懂……

弱智选手并不会xx卷积……

代码

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+7;
const int mod = 1e9+7;
long long fac[maxn];
long long qpow(long long a,long long b)
{
long long ans=1;a%=mod;
for(long long i=b;i;i>>=1,a=a*a%mod)
if(i&1)ans=ans*a%mod;
return ans;
}
long long C(long long n,long long m)
{
if(m>n||m<0)return 0;
long long s1=fac[n],s2=fac[n-m]*fac[m]%mod;
return s1*qpow(s2,mod-2)%mod;
}
int a[maxn];
int dp[maxn][22];
int K=20;
int main()
{
fac[0]=1;
for(int i=1;i<maxn;i++)
fac[i]=fac[i-1]*i%mod;
int t;
scanf("%d",&t);
while(t--)
{
int n,m;
memset(dp,0,sizeof(dp));
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
dp[i][0]=a[i];
for(int i=1;i<=n;i++)
for(int j=i+i;j<=n;j+=i)
for(int k=0;k<K;k++)
dp[j][k+1]=(dp[j][k+1]+dp[i][k])%mod;
for(int i=1;i<=n;i++)
{
int ans = 0;
for(int j=0;j<=K;j++)
ans=(ans+1ll*C(m,j)*dp[i][j])%mod;
if(i==n)printf("%d",ans);else printf("%d ",ans);
}
printf("\n");
}
}

最新文章

  1. 了解PHP中的register_shutdown_funcion
  2. 解猜数字(XAXB)
  3. ubuntu 下创建桌面快捷方式
  4. C/C++中static关键字作用总结
  5. 【转】keypress keydown keyup 区别
  6. Java多线程之新类库中的构件CountDownLatch
  7. TortoiseGit&#39;s Settings
  8. 用JAVA写一个函数,功能例如以下: 随意给定一组数, 找出随意数相加之后的结果为35(随意设定)的情况
  9. react-native之站在巨人的肩膀上
  10. 提升ReSharper和Visual Studio的性能
  11. cuda核函数再调用核函数,多层并行
  12. android AChartEngine源代码
  13. ajax异步请求实例
  14. python解决接口测试获取手机验证码问题
  15. 【Spring】高级装配
  16. 每日分享!JavaScript的鼠标事件(11个事件)
  17. java 编写函数将字符串的首尾空格删除。
  18. 当一个HTML元素需要添加mouseon、mouseout与click事件,或者mouserenter、mouseleave和click事件时,click事件无法触发
  19. 大数据入门到精通9-真正得wordcount
  20. oracle 函数to_char(数据,&#39;FM999,999,999,999,990.00&#39;) 格式化数据(转)

热门文章

  1. Git 配置环境及常用命令整理
  2. springSecurity自定义认证配置
  3. bzoj千题计划222:bzoj2329: [HNOI2011]括号修复(fhq treap)
  4. Linux使用imagemagick的convert命令压缩图片、节省服务器空间
  5. 【原创】backbone1.1.0源码解析之View
  6. linux离线部署redis及redis.conf详解
  7. oracle用户密码过期!the password has expired
  8. HDU 2159 FATE (二维背包)
  9. 第12月第29天 cocos quick manual
  10. (FFT)A+B Problem