比赛的时候就预感到这题能出,但是会耗时比较多。结果最后是出了,但是有更简单的题没出。

是不是错误的决策呢?谁知道呢

题目意思:

  定义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题的更多相关文章

  1. HDU 4747 Mex (2013杭州网络赛1010题,线段树)

    Mex Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Submis ...

  2. ZOJ Bizarre Routine 2013杭州网赛B题

    题目意思: 给定n, expect, a, b 要求你构造一组array[],存放一个1..n的排列,使的下面的程序能输出YES 题目所示代码: bool less_than(x, y) { T++; ...

  3. 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 ...

  4. 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 ...

  5. HDU 4738 Caocao's Bridges (2013杭州网络赛1001题,连通图,求桥)

    Caocao's Bridges Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  6. 2013杭州现场赛B题-Rabbit Kingdom

    杭州现场赛的题.BFS+DFS #include <iostream> #include<cstdio> #include<cstring> #define inf ...

  7. HDU 4816 Bathysphere (2013长春现场赛D题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4816 2013长春区域赛的D题. 很简单的几何题,就是给了一条折线. 然后一个矩形窗去截取一部分,求最 ...

  8. HDU 4768 Flyer (2013长春网络赛1010题,二分)

    Flyer Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  9. 2013杭州网赛 1001 hdu 4738 Caocao's Bridges(双连通分量割边/桥)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4738 题意:有n座岛和m条桥,每条桥上有w个兵守着,现在要派不少于守桥的士兵数的人去炸桥,只能炸一条桥 ...

随机推荐

  1. JNDI整理

    JNDI 什么是JNDI JNDI全称为Java Naming and Directory Interface,命名及目录查找接口,是java平台的一种标准扩展,它提供了一系列接口.类和命名空间的概念 ...

  2. Java - 静态内部类

    Java语言允许在类中再定义类,这种在其它类内部定义的类就叫内部类.内部类又分为:常规内部类.局部内部类.匿名内部类和静态嵌套类四种. 1.静态内部类定义 静态内部类,定义在类中,任何方法外,用sta ...

  3. 用python画小猪佩奇(非原创)

    略作改动: # coding:utf-8 import turtle as t t.screensize(400, 300, "blue") t.pensize(4) # 设置画笔 ...

  4. float元素浮动后高度不一致导致错位的解决办方法

    换行开始的第一个元素clear:left;即可 例如  四列时应该时第5个,9个...加clear:left; .row .col-lg-3:nth-child(4n+1),.row .col-md- ...

  5. PAT (Basic Level) Practice 1004 成绩排名

    个人练习 读入n名学生的姓名.学号.成绩,分别输出成绩最高和成绩最低学生的姓名和学号. 输入格式:每个测试输入包含1个测试用例,格式为\ 第1行:正整数n 第2行:第1个学生的姓名 学号 成绩 第3行 ...

  6. spark&dataframe

    1.今天,我们来介绍spark以及dataframe的相关的知识点,但是在此之前先说一下对以前的hadoop的一些理解 当我启动hadoop的时候,上面有hdfs的存储结构,由于这个是分布式存储,所以 ...

  7. android onCreate的两个方法

    override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) { } override ...

  8. linux中jdk的安装与mysql 的安装

    1.linux安装jdk #先找到 安装包#cd /usr/java tar -zxvf jdk-8u31-linux-x64.tar.gz 2.安装选择要安装java的位置,如/usr/目录下,新建 ...

  9. 直接插入排序&希尔排序

    1.直接插入排序 时间复杂度O(n2) 工作原理: 通过构建有序序列,对于未排序数据,在已排序的序列中,从后向前扫描,找到相应的位置并插入. 插入排序在实现上,在从后向前扫描的过程中,需要反复把已排序 ...

  10. centos使用--软件启动关闭等操作的命令

    关于centos服务的命令经常会遇到这几种 service systemctl /etc/init.d/ 1 service和/etc/init.d/ service是一个脚本命令,分析service ...