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个兵守着,现在要派不少于守桥的士兵数的人去炸桥,只能炸一条桥 ...
随机推荐
- JNDI整理
JNDI 什么是JNDI JNDI全称为Java Naming and Directory Interface,命名及目录查找接口,是java平台的一种标准扩展,它提供了一系列接口.类和命名空间的概念 ...
- Java - 静态内部类
Java语言允许在类中再定义类,这种在其它类内部定义的类就叫内部类.内部类又分为:常规内部类.局部内部类.匿名内部类和静态嵌套类四种. 1.静态内部类定义 静态内部类,定义在类中,任何方法外,用sta ...
- 用python画小猪佩奇(非原创)
略作改动: # coding:utf-8 import turtle as t t.screensize(400, 300, "blue") t.pensize(4) # 设置画笔 ...
- float元素浮动后高度不一致导致错位的解决办方法
换行开始的第一个元素clear:left;即可 例如 四列时应该时第5个,9个...加clear:left; .row .col-lg-3:nth-child(4n+1),.row .col-md- ...
- PAT (Basic Level) Practice 1004 成绩排名
个人练习 读入n名学生的姓名.学号.成绩,分别输出成绩最高和成绩最低学生的姓名和学号. 输入格式:每个测试输入包含1个测试用例,格式为\ 第1行:正整数n 第2行:第1个学生的姓名 学号 成绩 第3行 ...
- spark&dataframe
1.今天,我们来介绍spark以及dataframe的相关的知识点,但是在此之前先说一下对以前的hadoop的一些理解 当我启动hadoop的时候,上面有hdfs的存储结构,由于这个是分布式存储,所以 ...
- android onCreate的两个方法
override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) { } override ...
- linux中jdk的安装与mysql 的安装
1.linux安装jdk #先找到 安装包#cd /usr/java tar -zxvf jdk-8u31-linux-x64.tar.gz 2.安装选择要安装java的位置,如/usr/目录下,新建 ...
- 直接插入排序&希尔排序
1.直接插入排序 时间复杂度O(n2) 工作原理: 通过构建有序序列,对于未排序数据,在已排序的序列中,从后向前扫描,找到相应的位置并插入. 插入排序在实现上,在从后向前扫描的过程中,需要反复把已排序 ...
- centos使用--软件启动关闭等操作的命令
关于centos服务的命令经常会遇到这几种 service systemctl /etc/init.d/ 1 service和/etc/init.d/ service是一个脚本命令,分析service ...