UESTC - 1172 三句话题意
记一个集合的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 三句话题意的更多相关文章
- 三句话看明白jdk收费吗
对于从oracle下载的jdk8:JDK8u200(含)以下版本不收费. 对于从oracle下载的jdk11:JDK 11.0.0不收费,JDK 11.0.1不收费. 对于openjdk:免费 ——— ...
- 【Hadoop】三句话告诉你 mapreduce 中MAP进程的数量怎么控制?
1.果断先上结论 1.如果想增加map个数,则设置mapred.map.tasks 为一个较大的值. 2.如果想减小map个数,则设置mapred.min.split.size 为一个较大的值. 3. ...
- CDOJ 1171 两句话题意
题目链接:http://acm.uestc.edu.cn/#/problem/show/1171 题解: 这道题应该从gcd出来的值入手. 我们要求所有子集的gcd的和 首先我们先统计一下每个数字出现 ...
- iOS三句话实现文本转语音:AVSpeechSynthesizer
一.介绍 从iOS5开始,iOS系统已经在siri上集成了语音合成的功能,但是是私有API.但是在iOS7,新增了一个简单的API----AVSpeechSynthesizer来做这件事情. 二.案例 ...
- 【干货!!】三句话搞懂 Redis 缓存穿透、击穿、雪崩
前言 如何有效的理解并且区分 Reids 穿透.击穿和雪崩之间的区别,一直以来都挺困扰我的.特别是穿透和击穿,过一段时间就稀里糊涂的分不清了. 为了有效的帮助笔者自己,以及拥有同样烦恼的朋友们区分这三 ...
- 三句话告诉你break、return、continue!
break:终止循环执行循环体下面的代码 return:终止循环并且退出循环所在的方法 continue:终止当前循环,进行下一次循环
- 三句话搞定FireDAC连接池
form上拖入: FDManager1: TFDManager; FDConnection1: TFDConnection; //初始化连接池procedure TForm1.InitDBPool;b ...
- 四句话总结JavaScript作用域
上一篇文章中简单介绍了一下JS作用域,本篇将作进一步探究和总结. 前言:JavaScript的作用域一直以来都是前端开发中比较难以理解的知识点,JavaScript6中新引入了 let 关键字,用于指 ...
- 三句话说清楚ssh端口转发
看了下自己以前的笔记发现也没有完全搞清楚, 网上好多文章都是抄来抄去,远程端口转发全都是拿127.0.0.1举例 总结了下,三句话就可以讲清楚了 1 ssh本地端口转发是 把ssh服务器可以访问到 ...
随机推荐
- [转帖]git命令参考手册
git init # 初始化本地git仓库(创建新仓库) git ...
- ESXi虚拟机开机进入bios的方法
想要修改启动顺序, 发现界面比较难弄 应该是在设置里面有修正. 首先编辑设置 增加如下设置 就可以了.
- MongoDB导入导出以及数据库备份以及.dat数据
1.导出工具:mongoexport 1.概念: mongoDB中的mongoexport工具可以把一个collection导出成JSON格式或CSV格式的文件.可以通过参数指 ...
- Delphi的关键字
Constructor;构造器,定义构造函数使用Constructor关键字
- java.util.concuttent Callable Future详解
在传统的多线程实现方式中(继承Thread和实现Runnable)无法直接获取线程执行的返回结果,如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来就比较麻烦. 从 ...
- 最小费用最大流spfa
#include <iostream> #include <cstring> #include <cstdio> #include <queue> #d ...
- MT【241】红蓝两色染色
用红蓝两色给$3*3$的格子染色,要求每行每列每种颜色都有,则不同的染色方法_____ 分析:按红色格子数分类,1)红色3或者6个有6种.2)红色4或者5个有45种.故一共有2*(6+45)=102种 ...
- LOJ #6436. 「PKUSC2018」神仙的游戏(字符串+NTT)
题面 LOJ #6436. 「PKUSC2018」神仙的游戏 题解 参考 yyb 的口中的长郡最强选手 租酥雨大佬的博客 ... 一开始以为 通配符匹配 就是类似于 BZOJ 4259: 残缺的字符串 ...
- 打开SharePoint 2013 web application显示iis 欢迎页面
当我打开SP web application时,页面显示如下: 查看event log,发现有一些8315-8317之类的error,发现把request management service停掉后, ...
- 【poj2396】 Budget
http://poj.org/problem?id=2396 (题目链接) 题意 给出一个矩阵,给出每一行每一列的和,以及若干限制条件,限制了其中每一个元素的上下界,求一种可行的方案使得每一行每一列数 ...