Light OJ 1341 Aladdin and the Flying Carpet
题意:求大于b的a的因数对有几组。例10 2结果为{2,5},12 2结果为{2,6}{3,4}-----不反复
解一:分解质因数+DFS
- #include <iostream>
- #include <string.h>
- #include <math.h>
- using namespace std;
- typedef long long ll;
- const int maxn=1000005;
- int prime[maxn];
- int num[maxn];
- int dig[200];
- int dignum[200];
- int p;
- void inti() //筛选素数
- {
- p=0;
- memset(prime,0,sizeof(prime));
- memset(num,0,sizeof(num));
- for(int i=2;i<maxn;i++)
- {
- if(!prime[i])
- {
- num[p++]=i;
- for(int j=2;j*i<maxn;j++)
- prime[i*j]=1;
- }
- }
- return ;
- }
- ll pp;
- void dfs(ll tot,int t,int l,ll a,ll b) //dfs找到全部符合的因数
- {
- if(((double)tot*tot)>=a)
- return ;
- if(tot>=b)
- pp++;
- for(int i=t;i<l;i++)
- {
- if(dig[i])
- {
- ll temp=tot*dignum[i];
- if(((double)temp*temp)>=a)
- return ;
- dig[i]--;
- dfs(temp,i,l,a,b);
- dig[i]++;
- }
- }
- return ;
- }
- int main()
- {
- ll a,b;
- int t;
- inti();
- while(cin>>t)
- {
- for(int i=1;i<=t;i++)
- {
- pp=0;
- cin>>a>>b;
- double limit=sqrt(a*1.0);
- if(b>=limit)
- {
- cout<<"Case "<<i<<": 0"<<endl;
- continue;
- }
- ll temp=a;
- int j=0;
- int time=0;
- while(j<=p) //全部的质因数
- {
- if((ll)num[j]*num[j]>temp) //小小的剪枝
- break;
- int flag=0;
- while(!(temp%num[j]))
- {
- temp/=num[j];
- flag++;
- }
- if(flag)
- {
- dignum[time]=num[j];
- dig[time++]=flag;
- }
- j++;
- }
- if(temp!=1)
- {
- dignum[time]=temp;
- dig[time++]=1;
- }
- /*for(j=0;j<time;j++)
- cout<<dignum[j]<<" "<<dig[j]<<endl;*/
- dfs(1,0,time,a,b);
- cout<<"Case "<<i<<": "<<pp<<endl;
- }
- }
- return 0;
- }
解二:直接计算
- #include <iostream>
- #include <string.h>
- #include <math.h>
- using namespace std;
- typedef long long ll;
- const int maxn=1000005;
- int prime[maxn];
- int num[maxn];
- int dig[200];
- int dignum[200];
- int p;
- void inti() //找素数
- {
- p=0;
- memset(prime,0,sizeof(prime));
- memset(num,0,sizeof(num));
- for(int i=2;i<maxn;i++)
- {
- if(!prime[i])
- {
- num[p++]=i;
- for(int j=2;j*i<maxn;j++)
- prime[i*j]=1;
- }
- }
- return ;
- }
- /*ll pp;
- void dfs(ll tot,int t,int l,ll a,ll b)
- {
- if(((double)tot*tot)>=a)
- return ;
- if(tot>=b)
- pp++;
- for(int i=t;i<l;i++)
- {
- if(dig[i])
- {
- ll temp=tot*dignum[i];
- if(((double)temp*temp)>=a)
- return ;
- dig[i]--;
- dfs(temp,i,l,a,b);
- dig[i]++;
- }
- }
- return ;
- }*/
- int main()
- {
- ll a,b;
- int t;
- inti();
- ll sum;
- while(cin>>t)
- {
- for(int i=1;i<=t;i++)
- {
- sum=1;
- cin>>a>>b;
- if(((double)b*b)>=a)
- {
- cout<<"Case "<<i<<": 0"<<endl;
- continue;
- }
- ll temp=a;
- int j=0;
- int time=0;
- while(j<=p)
- {
- if((double)num[j]*num[j]>temp)
- break;
- int flag=0;
- while(!(temp%num[j]))
- {
- temp/=num[j];
- flag++;
- }
- sum*=(flag+1); //排列组合。把全部的情况拿出来
- j++;
- }
- if(temp!=1)
- {
- sum*=2; //还有没除尽的要给全部可能性乘2
- }
- sum/=2; //直接除2,把反复的部分和正方形除去了
- ll limit=sqrt(a*1.0);
- for(j=1;j<b;j++) //去掉不符合要求的矩形
- if(!(a%j))
- sum--;
- /*for(j=0;j<time;j++)
- cout<<dignum[j]<<" "<<dig[j]<<endl;*/
- //dfs(1,0,time,a,b);
- cout<<"Case "<<i<<": "<<sum<<endl;
- }
- }
- return 0;
- }
第一种方法easy爆站。另外一种方法算是凑着它数据的b偏小才这么做的,两种方法个人感觉差点儿相同,希望各位大牛指正。
Light OJ 1341 Aladdin and the Flying Carpet的更多相关文章
- Light OJ 1341 Aladdin and the Flying Carpet Pollard_rho整数分解+DFS
进入a b 多少努力p, q 使p*q == a && p < q && p >= b 直接大整数分解 然后dfs所有可能的解决方案劫持 #include ...
- LightOJ 1341 - Aladdin and the Flying Carpet (唯一分解定理 + 素数筛选)
http://lightoj.com/volume_showproblem.php?problem=1341 Aladdin and the Flying Carpet Time Limit:3000 ...
- 1341 - Aladdin and the Flying Carpet ---light oj (唯一分解定理+素数筛选)
http://lightoj.com/volume_showproblem.php?problem=1341 题目大意: 给你矩形的面积(矩形的边长都是正整数),让你求最小的边大于等于b的矩形的个数. ...
- LOJ 1341 Aladdin and the Flying Carpet(质因子分解)
题目链接:http://lightoj.com/volume_showproblem.php?problem=1341 题意:给两个数a,b,求满足c * d = a且c>=b且d>=b的 ...
- [LightOJ 1341] Aladdin and the Flying Carpet (算数基本定理(唯一分解定理))
题目链接: https://vjudge.net/problem/LightOJ-1341 题目描述: 问有几种边长为整数的矩形面积等于a,且矩形的短边不小于b 算数基本定理的知识点:https:// ...
- LightOJ 1341 Aladdin and the Flying Carpet(唯一分解定理)
http://lightoj.com/volume_showproblem.php?problem=1341 题意:给你矩形的面积(矩形的边长都是正整数),让你求最小的边大于等于b的矩形的个数. 思路 ...
- LightOJ 1341 - Aladdin and the Flying Carpet 基本因子分解
http://www.lightoj.com/volume_showproblem.php?problem=1341 题意:给你长方形的面积a,边最小为b,问有几种情况. 思路:对a进行素因子分解,再 ...
- LightOJ 1341 - Aladdin and the Flying Carpet
题目链接:http://lightoj.com/volume_showproblem.php?problem=1341 题意:给你地毯面积和最小可能边的长度,让你求有几种组合的可能. 题解:这题就厉害 ...
- LightOJ 1341 Aladdin and the Flying Carpet【整数分解】
题目链接: http://lightoj.com/login_main.php?url=volume_showproblem.php?problem=1341 题意: 给定一个数,将其拆分成两个数的乘 ...
随机推荐
- CDR X6三折促销活动,可入
继CDR X6双十二限量活动之后,CorelDRAW官方为庆祝2018新年新气象,折扣狂潮,又来一波.上次活动由于时间短,任务急,数量少,使得不少小伙伴抱憾而止,选择默默等待良机.现在,良机来了,即便 ...
- nodejs 封装mysql连接池
写在前面的 在nodejs后台代码中,我们总是会和数据库打交道 然而,每次都要写数据库的配置以及连接和断开,不胜其烦 我就封装了一个连接池模块,不足之处还请多多批评 上代码 一下是写在mysqls.j ...
- 登录生成令牌token存于redis
package com.medic.rest.province.base.home; import java.util.HashMap;import java.util.List;import jav ...
- (2016北京集训十二)【xsy1542】疯狂求导
题解: 这题看起来很难...但是实际上并没有想象中的那么难 第一眼看上去不会求导公式怎么办?不要紧,题目背景非常良心的给出了题目中的导数计算公式 求完导合并同类项很恶心怎么办?不要紧,样例解释说明了不 ...
- Linux Eslint 命令行
Linux 命令行 ls : 查看所有文件 ls -la : 编列文件并展示权限 sudo chmod 777 -R 文件名 : 文件权限升级 cp : 复制 cp file_na ...
- POJ1743Musical Theme(后缀数组+二分)
题意 有N(1 <= N <=20000)个音符的序列来表示一首乐曲,每个音符都是1..88范围内的整数,现在要找一个重复的主题.“主题”是整个音符序列的一个子串,它需要满足如下条件: 1 ...
- dropload上拉加载 下拉刷新
1.引入css.js <link rel="stylesheet" href=" ${pageContext.request.contextPath}/dist/d ...
- python学习(二):基本数据类型:整型,字符型
整型: type():显示数据类型 # 整型,int # python3里,不管数字有多大,都是int类型 # python2里,有大小区分,长整型:long int a = " print ...
- ASP.NET-缓存基本知识点
asp.net cache是一种缓存技术,然而,我们在asp.net程序中还可以使用其他的缓存技术,这些不同的缓存也各有所长.由于asp.net cache不能提供对外访问能力,因此,它不可能取代以m ...
- 洛谷 P1193 洛谷团队训练VS传统团队训练
P1193 洛谷团队训练VS传统团队训练 题目背景 “在中学的信息学教育领域,洛谷无疑是一个相当受欢迎的辅助网站.同时有百余所学校正在通过洛谷进行信息学竞赛(以后简称OI)的教育.洛谷之所以如此受欢迎 ...