博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
GDUT校赛
阅读量:4575 次
发布时间:2019-06-08

本文共 1856 字,大约阅读时间需要 6 分钟。

题目链接:http://4.gdutcode.sinaapp.com/contest.php?cid=1021

 

F

题意:给出n和m,要求满足gcd(x,y)=n && lcm(x,y)=m的pair(x,y)的个数

sol:先YY一下:

设   gcd(x,y)=n,lcm(x,y)=m

那么有x=a*n,y=b*n  ;  m=c*x,m=d*y    (其中a与b互质,c与d互质)

那么有m=a*c*n,m=b*d*n

又因为a、b、c、d必须是整数,所以m/n必须是整数,即m%n==0    //(不用纠结。。。这条性质是确定的)

设N=m/n,那么有a*c=b*d=N        (其中a与b互质,c与d互质)

这里会有一个奇怪的事实:要想满足这个条件,那么a与c互质,b与d互质

证明自己想去。。。。。。(逃

证明:设a有质因子AA,那么b一定没有质因子AA

   又因为ac=bd,所以d必须有质因子AA

   又因为c和d互质,所以c一定没有质因子AA

     所以a有的质因子c一定不能有。所以a与c互质。

         同理可证b和d互质

这时问题就转化成了:在N的所有约数中,找出所有互质的pair。

O(sqrt(N))就可以搞定~

 

在coding的时候注意一个地方:

 LL T=sqrt(N*1.0);

那个1.0是必须要乘的,因为sqrt的参数需要是浮点数

 

1 #include 
2 #include
3 #include
4 using namespace std; 5 #define LL long long 6 7 LL gcd(LL a,LL b) 8 { 9 if (b==0) return a;10 return gcd(b,a%b);11 }12 13 int T;14 LL n,m;15 int main()16 {17 scanf("%d",&T);18 while (T--)19 {20 //scanf("%lld%lld",&n,&m);21 cin>>n>>m;22 //gcd=n lcm=m23 if (m%n!=0)24 printf("0\n");25 else26 {27 LL ans=0;28 LL N=m/n;29 LL i,Tm;30 LL T=sqrt(N*1.0);31 for (i=1;i<=T;i++)32 {33 if (N%i==0)34 {35 Tm=N/i;36 if (gcd(Tm,i)==1)37 ans++;38 }39 }40 cout<
<
View Code

 

 

 

O

很水的找规律题啦~

1 #include 
2 #include
3 using namespace std; 4 5 long long N,M,tm; 6 7 int main() 8 { 9 while(~scanf("%lld",&N))10 {11 M=N/3;12 tm=N%3; //0,1,213 M=M*2;14 if (tm==2) M++;15 printf("%lld\n",M);16 }17 return 0;18 }
View Code

 

转载于:https://www.cnblogs.com/pdev/p/4351831.html

你可能感兴趣的文章
在 OC 中调用 Swift 代码
查看>>
安卓|五大逆向软件下载
查看>>
5 OK6410裸机调试(不用Jlink)
查看>>
“模板”学习笔记(5)-----编译器在处理函数模板的时候都干了啥
查看>>
教你用shell写CGI程序
查看>>
窗口 对话框 Pop Dialog 示例
查看>>
ubuntu(centos) server安装vmware tools
查看>>
数据结构之最大不重复串
查看>>
为什么要配置sdk-tools/platform-toools?
查看>>
自己动手开发更好用的markdown编辑器-07(扩展语法)
查看>>
队列的循环队列
查看>>
程序中的日期格式
查看>>
大众点评CAT错误总结以及解决思路
查看>>
从0开始学爬虫3之xpath的介绍和使用
查看>>
vim下正则表达式的非贪婪匹配
查看>>
一个python的计算熵(entropy)的函数
查看>>
spring源码学习——spring整体架构和设计理念
查看>>
模拟window系统的“回收站”
查看>>
报文格式【定长报文】
查看>>
RDLC报表钻取空白页问题
查看>>