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服务器可以访问到 ...
随机推荐
- 关于Tomcat性能监控的第三方工具Probe的简介
Tomcat Probe => Lambda Probe =>PSI Probe,这个小工具已经三易其名了.(现在挪窝到GitHub了,很方便). 这个Probe可以说是一个增强版本的 T ...
- Java使用HTTPClient4.3开发的公众平台消息模板的推送功能
代码引用,参考文章:http://www.cnblogs.com/feiyun126/p/4778556.html,表示感谢! package com.yuanchuangyun.cyb.manage ...
- lsof 查看端口占用的进程ID
1. nohup execute >/dev/null 2>&1 & 提交了一个后台jobs 2. 然后查看一下 哪个进程正在用 3. yum 安装lsof yum ins ...
- Node http和express和mysql
const http = require("http");const express = require("express");const mysql = re ...
- Fantacy团队周四站立会议
词频分析模型 1.会议时间:2016年3月31日12:07~12:30. 持续时长:23分钟 会议参加成员:组长:杨若鹏 http://www.cnblogs.com/robinYangRP/ 组员: ...
- hive数据查询
Fetch task 丢弃了mapreduce的作业的繁重任务,查询方便简单 1.第一种方式 2.linux命令行 3.地3中
- tomcat 查看和修改内存
为了解决tomcat在大进行大并发请求时,出现内存溢出的问题,请修改tomcat的内存大小,其中分为以下两种方式: 一.使用 catalina.bat 等命令行方式运行的 tomcat 查看系统最大支 ...
- JavaScript--XML DOM 总结
XML DOM 2018-09-04 XML简介 1.什么是XML XML 指可扩展标记语言(EXtensible Markup Language) XML 是一种标记语言,很类似 HTML XML ...
- Codeforces976E Well played! 【贪心】
题目分析: 由于乘二的收获很大,所以我们可以证明乘的数一定是同一个,接着排序后依次选取,判断一下即可. 题目代码: #include<bits/stdc++.h> using namesp ...
- MT【64】2017联赛一试不等式的一个加强练习
已知$x_1,x_2,x_3\ge0,x_1+x_2+x_3=1$求 $$(x_1+3x_2+5x_3)(x_1+\frac{1}{3}x_2+\frac{1}{5}x_3)(x_1+x_3+3x_2 ...