题意:

给定一个整数L(L<=1e12),计算(x,y,z)组的个数。其中x<y<z,x^2+y^2=z^2,gcd(x,y)==1,gcd(x,z)==1,gcd(y,z)==1。

思路:

以下的方法可用来找出勾股数。设m>n 、 m 和 n 均是正整数,

a = m^2-n^2    b = 2mn   c = m^2+n^2

若 m 和 n 是互质,而且 m 和 n 其中有一个是偶数,计算出来的
(a, b, c) 就是素勾股数

然后我们需要的便是计算m,n互质 qie m,n一奇一偶

因为 m^2*2 = a+c,所以可以求出m的范围 sqrt(l),然后可以求出n的范围t

于是通过枚举m,并求出n,然后对他们进行判断即可

参考knownothing

①当m为偶数时,

如果m <= t,那么n可以取[1,m]中与m互质的数,因为他们一定是奇数

如果m > t,那么n只能取[1,t]中与m互质的数

②当m为奇数时:

如果m <= t,那么n可以取[1,m]中与m/2互质的数,如果ai是[1,m/2]中与m互质的,那么2*ai便是与m互质的偶数

如果m > t,那么n只能取[1,t]中与t/2互质的数

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
typedef long double ld;
const ld eps=1e-10;
const int inf = 0x3f3f3f;
const int maxn = 1e6;
const int MOD = 1e9+7;
bool check[maxn+10];
int prime[maxn+10];
int phi[maxn+10];
int factor[105];
int facnum;
int tot; void phi_and_prime(int N)
{
memset(check,0,sizeof(check));
phi[1] = 1;
tot = 0; for(int i = 2; i <= N; i++)
{
if(!check[i])
{
prime[tot++] = i;
phi[i] = i - 1;
}
for(int j = 0; j < tot; j++)
{
if(i*prime[j] > N) break;
check[i*prime[j]] = true;
if(i % prime[j] == 0 )
{
phi[i*prime[j]] = phi[i] * prime[j];
break;
}
else
{
phi[i * prime[j]] = phi[i] * (prime[j]-1);
}
}
}
} void fac(int x)
{
int tp = x;
facnum = 0;
for(int i = 0; i < tot && prime[i]*prime[i] <= maxn; i++)
{
if(tp % prime[i] == 0)
{
factor[facnum++] = prime[i];
while(tp % prime[i] == 0)
{
tp /= prime[i];
}
}
if(tp == 1)
break;
}
if(tp > 1)
factor[facnum ++ ] = tp; return ;
} ll ans;
void dfs(int cur,int mul,int tot,int n) //搜索实现互斥
{
if(cur == facnum)
{
if(tot & 1) ans = ans - n/mul;
else ans = ans + n/mul;
return ;
}
dfs(cur+1,mul*factor[cur],tot+1,n);
dfs(cur+1,mul,tot,n);
} int main()
{
int T;
ll n;
phi_and_prime(maxn);
scanf("%d",&T);
while(T--)
{
scanf("%I64d",&n);
ll p = sqrt(n + 0.5); //估计m范围
ans = 0;
for(int i = 1; i <= p; i++) //枚举
{
int q = sqrt(n - (ll)i*i + 0.5); //估计n的范围 if(i % 2)
{
fac(i);
if(q >= i) dfs(0,1,0,i>>1);
else dfs(0,1,0,q>>1);
}
else
{
fac(i);
if(q >= i) ans += phi[i];
else dfs(0,1,0,q);
}
}
printf("%I64d\n",ans);
}
return 0;
}

  

hdu 3939(勾股+容斥)的更多相关文章

  1. C - Visible Trees HDU - 2841 -莫比乌斯函数-容斥

    C - Visible Trees HDU - 2841 思路 :被挡住的那些点(x , y)肯定是 x 与 y不互质.能够由其他坐标的倍数表示,所以就转化成了求那些点 x,y互质 也就是在 1 - ...

  2. HDU 5297 Y sequence 容斥 迭代

    Y sequence 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5297 Description Yellowstar likes integer ...

  3. hdu 6053 trick gcd 容斥

    http://acm.hdu.edu.cn/showproblem.php?pid=6053 题意:给定一个数组,我们定义一个新的数组b满足bi<ai 求满足gcd(b1,b2....bn)&g ...

  4. HDU 4609 3-idiots FFT+容斥

    一点吐槽:我看网上很多分析,都是在分析这个题的时候,讲了半天的FFT,其实我感觉更多的把FFT当工具用就好了 分析:这个题如果数据小,统计两个相加为 x 的个数这一步骤(这个步骤其实就是求卷积啊),完 ...

  5. HDU 4336 Card Collector(容斥)

    题意:要收集n种卡片,每种卡片能收集到的概率位pi,求收集完这n种卡片的期望.其中sigma{pi} <=1; 思路:容斥原理.就是一加一减,那么如何算期望呢.如果用二进制表示,0表示未收集到, ...

  6. HDU 4135 Co-prime(容斥+数论)

    Co-prime Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  7. HDU 3970 Harmonious Set 容斥欧拉函数

    pid=3970">链接 题解:www.cygmasot.com/index.php/2015/08/17/hdu_3970 给定n  求连续整数[0,n), 中随意选一些数使得选出的 ...

  8. HDU 4135 Co-prime(容斥:二进制解法)题解

    题意:给出[a,b]区间内与n互质的个数 思路:如果n比较小,我们可以用欧拉函数解决,但是n有1e9.要求区间内互质,我们可以先求前缀内互质个数,即[1,b]内与n互质,求互质,可以转化为求不互质,也 ...

  9. 多校 HDU 6397 Character Encoding (容斥)

    题意:在0~n-1个数里选m个数和为k,数字可以重复选: 如果是在m个xi>0的情况下就相当于是将k个球分割成m块,那么很明显就是隔板法插空,不能为0的条件限制下一共k-1个位置可以选择插入隔板 ...

随机推荐

  1. django搭建web (二) urls.py

    URL模式: 在app下的urls.py中 urlpatterns=[ url(正则表达式,view函数,参数,别名,前缀)] urlpatterns=[ url(r'^hello/$',hello. ...

  2. IOS UITextView自适应高度

    LOFTER app需要实现了一个类似iPhone短信输入框的功能,它的功能其实蛮简单,就是:[UITextView的高度随着内容高度的变化而变化].实现思路应该是: 在UITextView的text ...

  3. OSI七层协议模型、TCP/IP四层模型学习笔记

    1. OSI七层和TCP/IP四层的关系 1.1 OSI引入了服务.接口.协议.分层的概念,TCP/IP借鉴了OSI的这些概念建立TCP/IP模型. 1.2 OSI先有模型,后有协议,先有标准,后进行 ...

  4. gradle入门(1-5)创建并运行Web应用

    一.使用Gretty运行Web应用 Gretty支持Jetty和Tomcat,它不会被Gradle缺少SLF4J绑定所导致的问题所困扰. 1.配置文件build.gradle buildscript ...

  5. VS2013 工程属性配置

    1. 配置属性设置 设置工程编译输出目录 2. 设置第三方库的头文件的位置 3.设置第三方库(动态库或者静态库链接的搜寻的目录) 4.设置链接的第三方库的名称 注: 第三方库的链接可以通过配置文件来实 ...

  6. H5的canvas绘图技术

    canvas元素是HTML5中新添加的一个元素,该元素是HTML5中的一个亮点.Canvas元素就像一块画布,通过该元素自带的API结合JavaScript代码可以绘制各种图形和图像以及动画效果. 1 ...

  7. CSS属性操作

    CSS属性操作 1 属性选择器 Elenment(元素) E[att] 匹配所有具有att属性的E元素,不考虑它的值.(注意:E在此处可以省略)(推荐使用) 例如:[po]{ font-size: 5 ...

  8. netcore webapi帮助文档设置

    如何建 .netcore webapi 项目这个就不说了,这个都没有没必要看下去. 我这里是.netcore 2.0,虽然没测过1.0的,但想来差不多. 1.Nuget Packages安装,使用程序 ...

  9. javascript获取表单的各项值

    何谓表单? 表单是html页面中负责数据采集功能的部件,它往往由三个部分组成: 表单标签:<form></form> 用于声明表单的范围,位于表单标签中的元素将被提交.属性有m ...

  10. html2canvas 实现dashed虚线边框

    html2canvas是一个将html元素生成canvas的库,绘制的canvas大部分样式和CSS一致.比如截止1.0.0-alpha.12,虚线边框依然绘制为实线,border-collapse依 ...