HDU 4746 HDOJ Mophues 2013杭州网赛I题
比赛的时候就预感到这题能出,但是会耗时比较多。结果最后是出了,但是有更简单的题没出。
是不是错误的决策呢?谁知道呢
题目意思:
定义f(x) = x分解质因数出来的因子个数
如 x = p0 * p0 * p0 * p1 * p2,则f(x) = 5
特殊的, f(1) = 0
求 i = [1..n], j = [1..m] 组成的n*m组(i, j)对中,有多少组f( gcd(i,j) ) <= p
考虑简化版本,p = 0,即求有多少组 gcd(i,j) == 1。
见HDU 1695 http://acm.hdu.edu.cn/showproblem.php?pid=1695
师承叉姐(现在似乎叫御坂姐姐了...)的技能 莫比乌斯函数 + sqrt分块 可到0MS的题。
这题思路其实也大致差不多。
设d(x) 表示 gcd(i, j) 整除 x 的部分,容斥时的权值。
则满足 sigma( d(i) ) (i为x的所有约数) = ( f(x) >= p? 0 : 1 )
喜闻乐见,形如
for(i = 1;i<=n;i++)
for(j = i;j<=n;j+=i)
的nlogn预处理法
先预处理p=0..18时 每个数字在容斥中占的权值,然后求前缀和,最后sqrt分块计算。
Ps:由于题目的n,m范围下,f(x)最大为18,所以当p>18时,答案就为n*m
代码如下:
#include <vector>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N = ;
int pr[N],p[N],cn[N],lp;
//预处理素数,和f(x),记为cn[x]
void gp(){
for(int i=;i<N;i++){
if(!pr[i]){
p[lp++]=pr[i]=i;
cn[i] = ;
}
for(int j=;j<lp && i*p[j]<N;j++){
int num = i*p[j];
pr[num] = p[j];
cn[num] = cn[i]+;
if(i%p[j] == ) break;
}
}
}
//预处理p = 0..18时的d(x),记为tn[p][x]
int tn[][N];
void gtn(){
for(int i=;i<;i++){
tn[i][] = ;
for(int j=;j<N;j++){
if(cn[j] - i == ){
for(int k=j;k<N;k+=j)
tn[i][k]--;
}
else if(cn[j] > i){
int tmp = - - (tn[i][j]);
tn[i][j] = tmp;
if(tmp){
for(int k=j+j;k<N;k+=j)
tn[i][k] += tmp;
}
}
}
for(int j=;j<N;j++) tn[i][j]+=tn[i][j-];
}
}
void adn(vector<int> &s,int x){
s.push_back();
for(int i=;i*i<=x;i++){
s.push_back(i);
s.push_back(x/i);
}
}
ll n,m;
int k,*sm;
ll gao(){
vector<int> num;
adn(num,n);
adn(num,m);
sort(num.begin(),num.end());
num.erase(unique(num.begin(),num.end()),num.end());
ll ans = ;
int l = num.size();
sm = tn[k];
for(int i=;i<l;i++){
int d = num[i];
ll tmp = sm[d] - sm[num[i-]];
ans += tmp*(ll)(n/d)*ll(m/d);
}
return ans;
}
int main(){
//freopen("in.txt", "r", stdin);
gp();
gtn();
int T;
scanf("%d",&T);
while(T--){
scanf("%I64d%I64d%d",&n,&m,&k);
if(k> || (<<k)>=max(n,m)){
printf("%I64d\n",n*m);
continue;
}
printf("%I64d\n",gao());
}
return ;
}
HDU 4746 HDOJ Mophues 2013杭州网赛I题的更多相关文章
- HDU 4747 Mex (2013杭州网络赛1010题,线段树)
Mex Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total Submis ...
- ZOJ Bizarre Routine 2013杭州网赛B题
题目意思: 给定n, expect, a, b 要求你构造一组array[],存放一个1..n的排列,使的下面的程序能输出YES 题目所示代码: bool less_than(x, y) { T++; ...
- HDU 4741 Save Labman No.004 (2013杭州网络赛1004题,求三维空间异面直线的距离及最近点)
Save Labman No.004 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- HDU 4739 Zhuge Liang's Mines (2013杭州网络赛1002题)
Zhuge Liang's Mines Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- HDU 4738 Caocao's Bridges (2013杭州网络赛1001题,连通图,求桥)
Caocao's Bridges Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- 2013杭州现场赛B题-Rabbit Kingdom
杭州现场赛的题.BFS+DFS #include <iostream> #include<cstdio> #include<cstring> #define inf ...
- HDU 4816 Bathysphere (2013长春现场赛D题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4816 2013长春区域赛的D题. 很简单的几何题,就是给了一条折线. 然后一个矩形窗去截取一部分,求最 ...
- HDU 4768 Flyer (2013长春网络赛1010题,二分)
Flyer Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- 2013杭州网赛 1001 hdu 4738 Caocao's Bridges(双连通分量割边/桥)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4738 题意:有n座岛和m条桥,每条桥上有w个兵守着,现在要派不少于守桥的士兵数的人去炸桥,只能炸一条桥 ...
随机推荐
- DNS介绍与安装使用
DNS简介 DNS是互联网的一项服务.它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网.DNS使用TCP和UDP的53号端口. DNS服务的基本概念 在使用DNS前需要了解 ...
- struts2之标签库
使用Struts2标签的准备工作: 导入Struts2标签库,该标签定义文件位于 struts2-core-2.3.16.3.jar 的 METE-INF下的struts-tag.tld文件. < ...
- Python生成器、装饰器
## 生成器 - 生成器是用来创建Python序列的一个对象 - 通常生成器是为迭代器产生数据的 - 例如range()函数就是一个生成器 - 每次迭代生成器时,它都会记录上一次调用的位置,并返回下一 ...
- 【TP5.1】HTML标签自动转义,导致CKEditor保存内容无法正常显示!
问题:使用Thinkphp5.1 开发的时候显示CKEditor保存的内容不符合预期. 希望的样子,肯定是不显示<p><b>等标签,而是下面的样子. 因为刚开始使用TP5.1和 ...
- 谈一谈如何远程访问MySQL(腾讯云,云主机)
连接MySQL (其他的sql 基本相同套路) 腾讯云不管怎么设置端口和MySQL权限以及监听端口就是不能连接? 远程访问MySQL数据库的几个关键点 端口设置 数据库权限设置 数据库的监听端口设置 ...
- ajax 传递文件成功时 jQuery提示parsererror错误
后台返回值类型 改为:PrintWriter out = response.getWriter();String jsonStr = "{\"success\":\&qu ...
- openwrt(二) 配置openwrt及编译
导航 1. 配置openwrt 2. 编译openwrt 3. 错误记录 1. 配置openwrt 在openwrt的根目录下,执行make menuconfig. 这个界面我也只是了解了这两个选项而 ...
- [BZOJ3631][JLOI2014]松鼠的新家(树链剖分)
[BZOJ3631] 树剖模板题了, Code #include <cstdio> #include <algorithm> #define MID int mid=(l+r) ...
- CentOS下使用Mysql
安装过程百度,然后cd /etc->vi my.cnf修改配置文件,在mysqld下添加lower_case_table_name=1和character_set_server=utf8,保存退 ...
- Oozie wordcount实战
一.定义 基本概念 Action: An execution/computation task (Map-Reduce job, Pig job, a shell command). It can a ...