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

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

题目意思:

  定义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. 关于img底部空白

    <img>元素底部为何有空白? 问题: 最近听网课遇到这样一个问题,先po出代码如下: <!--html--> <div class="top"> ...

  2. 利用Selenium+java实现淘宝自动结算购物车商品(附源代码)

    转载请声明原文地址! 本次的主题是利用selenium+java实现结算购买购物车中的商品. 话不多说,本次首先要注意的是谷歌浏览器的版本,浏览器使用的驱动版本,selenium的jar包版本.   ...

  3. PPT入门学习笔记1:待修改

    一直被比人忽悠实在是累了,我可以接受自己的失误,但我接受不了别人一次又一次的坑我! 做PPT的原则是什么? 1.一个目标: "一个PPT只为一类人服务,针对不同的听众制作不同层次内容的PPT ...

  4. source insight插件

    直使用sourceinsight编辑C/C++代码,sourceinsight是一个非常好用的编辑工具可以任意定位,跳转,回退,本人一直 使用该工具做C/C++开发,sourceinsight能够满足 ...

  5. POJ-3126 BFS,埃式筛选及黑科技

    题目大意:给定两个四位素数a  b,要求把a变换到b,变换的过程要保证  每次变换出来的数都是一个 四位素数,而且当前这步的变换所得的素数  与  前一步得到的素数  只能有一个位不同,而且每步得到的 ...

  6. python正则表达式02--findall()和search()方法区别,group()方法

    import re st = 'asxxixxsaefxxlovexxsdwdxxyouxxde' #search()和 findall()的区别 a = re.search('xx(.*?)xxsa ...

  7. [原]sencha touch之表单二(注册页面)

    接着上一篇的登陆页面,来一个最简单的注册页面,几乎包含了常用的field Ext.application({ id:'itKingApp', launch:function(){ var formPa ...

  8. web在线调试

    xx <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta h ...

  9. laravel5.5中间件

    目录 1. 中间件知识 1. artisan 命令 2. 文件内容 3. 前置中间件和后置中间件 4. 使用中间件 2. 控制器中间件 1. 中间件知识 1. artisan 命令 php artis ...

  10. C# Json 序列化大全--任我行

    public class JsonHelper { /// <summary> /// 将Model转换为Json字符串 /// </summary> /// <type ...