题目链接

记一个集合的gcd为该集合内所有数的最大公约数, 
求一个给定集合的非空子集的gcd的k次方的期望~


Input

第一行有一个数t,表示数据组数 
接下去每组数据两行,第一行两个数n,k(0 <n,k<=10^6),表示该集合有n个数字。 <br="">第二行有n个数ai(0<=ai<=2000000)代表该集合内的所有元素。


Output

每组数据输出一行,为期望乘上2^n-1,之后取模10000007的结果。


Sample Input

2
5 1
1 2 3 4 5
3 2
2 3 6

Sample Output

42
64

Hint

样例2中gcd为1的非空子集集有{2,3},{2,3,6}两个, 
2的有{2},{2,6}两个,3的有{3},{3,6}两个,6的有{6}一个。 
所以期望是(2*1^2+2*22+2*3^2+1*42)/7=64/7。

题解 

  这题主要是得求出对应gcd值下的子集个数。对于gcd值,我们能够指定一个值x,那么x的倍数都可以组成任意子集。所以第一步统计每个数字的个数,然后假设当前gcd=x,那么此时的集合内元素数应该为x的倍数的个数。可为了求出所有的值,这里存在重复的,所以我们需要减去一部分,如果从大往小执行,这样减去的就是重复的部分。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long LL;
const int maxn = 2e6+;
const int mod = ;
int cnt[maxn],res[maxn];
LL num[maxn];
LL qpow(LL a,LL b){
LL res=;
while(b){
if(b&) res = (res*a)%mod;
a = (a*a)%mod;
b>>=;
}
return res%mod;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
int n,x,k,maxx=-;
memset(cnt,,sizeof(cnt));
memset(res,,sizeof(res));
memset(num,,sizeof(num));
scanf("%d%d",&n,&k);
for(int i=;i<n;i++){
scanf("%d",&x);
maxx=max(maxx,x);
cnt[x]++;
} for(int i=;i<=maxx;i++){
for(int j=;j*i<=maxx;j++){
res[i] += cnt[i*j];
}
}
for(int i=;i<=maxx;i++)
num[i]=(qpow(,res[i])-+mod)%mod;
for(int i=maxx;i>=;i--){
for(int j=;j*i<=maxx;j++){
num[i] = (num[i]-num[j*i]+mod)%mod;
}
} LL ans = ;
for(int i=;i<=maxx;i++){
ans = (ans+num[i]*qpow(i,k))%mod;
}
cout<<ans<<endl;
}
return ;
}

UESTC - 1172 三句话题意的更多相关文章

  1. 三句话看明白jdk收费吗

    对于从oracle下载的jdk8:JDK8u200(含)以下版本不收费. 对于从oracle下载的jdk11:JDK 11.0.0不收费,JDK 11.0.1不收费. 对于openjdk:免费 ——— ...

  2. 【Hadoop】三句话告诉你 mapreduce 中MAP进程的数量怎么控制?

    1.果断先上结论 1.如果想增加map个数,则设置mapred.map.tasks 为一个较大的值. 2.如果想减小map个数,则设置mapred.min.split.size 为一个较大的值. 3. ...

  3. CDOJ 1171 两句话题意

    题目链接:http://acm.uestc.edu.cn/#/problem/show/1171 题解: 这道题应该从gcd出来的值入手. 我们要求所有子集的gcd的和 首先我们先统计一下每个数字出现 ...

  4. iOS三句话实现文本转语音:AVSpeechSynthesizer

    一.介绍 从iOS5开始,iOS系统已经在siri上集成了语音合成的功能,但是是私有API.但是在iOS7,新增了一个简单的API----AVSpeechSynthesizer来做这件事情. 二.案例 ...

  5. 【干货!!】三句话搞懂 Redis 缓存穿透、击穿、雪崩

    前言 如何有效的理解并且区分 Reids 穿透.击穿和雪崩之间的区别,一直以来都挺困扰我的.特别是穿透和击穿,过一段时间就稀里糊涂的分不清了. 为了有效的帮助笔者自己,以及拥有同样烦恼的朋友们区分这三 ...

  6. 三句话告诉你break、return、continue!

    break:终止循环执行循环体下面的代码 return:终止循环并且退出循环所在的方法 continue:终止当前循环,进行下一次循环

  7. 三句话搞定FireDAC连接池

    form上拖入: FDManager1: TFDManager; FDConnection1: TFDConnection; //初始化连接池procedure TForm1.InitDBPool;b ...

  8. 四句话总结JavaScript作用域

    上一篇文章中简单介绍了一下JS作用域,本篇将作进一步探究和总结. 前言:JavaScript的作用域一直以来都是前端开发中比较难以理解的知识点,JavaScript6中新引入了 let 关键字,用于指 ...

  9. 三句话说清楚ssh端口转发

    看了下自己以前的笔记发现也没有完全搞清楚, 网上好多文章都是抄来抄去,远程端口转发全都是拿127.0.0.1举例 总结了下,三句话就可以讲清楚了   1 ssh本地端口转发是 把ssh服务器可以访问到 ...

随机推荐

  1. dip vs di vs ioc

    https://stackoverflow.com/questions/6766056/dip-vs-di-vs-ioc https://docs.microsoft.com/en-us/aspnet ...

  2. Docker 网络部分的简单学习以及转帖别人的blog

    1. 感谢一下 大神: http://www.cnblogs.com/sparkdev/ 最近有时间的话 就会读一下他的博客.学习了解docker相关的知识 今天简单做了下 测试 在这里面记录一下. ...

  3. 简单的数据库备份语句--Oracle+SQLSERVER

    1. 工作中经常需要备份数据库表, 有时候经常需要baidu或者是询问,简单些一下.. 如果备份表不存在时: Oracle的语法 create table zhaobsh as select * fr ...

  4. Jquery Ajax xml版Get请求PHP

    <!DOCTYPE html><html lang="zh-cn"><head> <meta charset="utf-8&qu ...

  5. [转]能用HTML/CSS解决的问题就不要使用JS

    原文链接:http://www.codeceo.com/article/html-css-not-js.html 为什么说能使用html/css解决的问题就不要使用JS呢?两个字,因为简单.简单就意味 ...

  6. jvm学习二:类加载器

    前一节详细的聊了一下类的加载过程,本节聊一聊类的加载工具,类加载器  ---  ClassLoader 本想自己写的,查资料的时候查到一篇大神的文章,写的十分详细 大家直接过去看吧http://blo ...

  7. Java和Spring邮件的发送

    方法一: java发送电子邮件:这里以发送qq邮件为例: package test; import java.util.Properties; import javax.mail.Authentica ...

  8. Codeforces Round#500 Div.2 翻车记

    A:签到 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> # ...

  9. 概率dp总结 正在更新

    借bin神一句话 概率DP主要用于求解期望.概率等题目. 转移方程有时候比较灵活. 一般求概率是正推,求期望是逆推.通过题目可以体会到这点. 先推公式 多个 -> 一个 明确dp[i]代表什么意 ...

  10. php动态获取常量

    class A1{ const V1='100'; const V2='200'; const V3='Hello world'; } $v1 = 'V3'; $a1 = constant('A1:: ...