题意:

ttt 组数据,第一个给定飞毯的面积为 sss,第二个是毯子的最短的边的长度大于等于这个数,毯子是矩形但不是正方形。

思路:

求出 sss 的所有因子,因为不可能是矩形,所以可以除以 222,最后暴力求出最短边长以内的因子,相减得出答案。

想要求出s以内的因子数量,就用到了唯一分解定理,先求素数想要求出s以内的因子数量,就用到了唯一分解定理,先求素数想要求出s以内的因子数量,就用到了唯一分解定理,先求素数

唯一分解定理:

任何一个大于1的自然数 N,如果N不为质数,那么N可以唯一分解成有限个质数的乘积N=P1a1 P2a2 P3a3 … Pnan,这里P1<P2<P3…<Pn均为质数,其中指数ai是正整数。这样的分解称为 N 的标准分解式

(1)一个大于1的正整数N,如果它的标准分解式为:N=P1a1 P2a2 P3a3 … Pnan ,那么它的正因数个数为 sum=(1+a1)(1+a2)(1+a3)(1+an)。

(2) 它的全体正因数之和为 (1+p11+p12+…+p1a1)(1+p21+p22+…+p2a2)(1pn1+pn2+…+pnan)。

LightOJ1220:LightOJ 1220:LightOJ1220: x=bp,求出最大的 p 可以是几?(LightOJ 1220 Mysterious Bacteria)

即求出 x的标准分解式中的所有a的最大公约数。

//LightOJ - 1341
#include<stdio.h>
#include<math.h>
#include<vector>
using namespace std;
int main()
{
int t,z=1;
bool book[1000910]= {0};
long long s,l;
vector<int>v;
for(int i=2; i<=1000010; i++)
if(!book[i])
for(int j=i*2; j<=1000010; j=j+i)
book[j]=1;
for(int i=2; i<=1000008; i++)
if(!book[i])
v.push_back(i); scanf("%d",&t);
while(t--)
{
scanf("%lld%lld",&s,&l);
if(l>=sqrt(s))
{
printf("Case %d: 0\n",z++);
continue;
}
long long sum=0;
for(long long i=1; i<l; i++)
if(s%i==0)
sum++;
long long i=0,ans=1;
while(i<v.size()&&v[i]<s)//素数小于 s
{
int tt=0;
while(s%v[i]==0)
{
tt++;
s=s/v[i];
}
ans=ans*(1+tt);//(1+a1)*(1+a2)*(1+a3)*.....*(1+an) //因子的数量
i++;
}
if(s>1)//若s>1,则为素数
ans=ans*2;
ans=ans/2;//几对素数
printf("Case %d: %lld\n",z++,ans-sum);
}
return 0;
}
//LightOJ 1220
#include<string.h>
#include<vector>
#include<stdio.h>
using namespace std;
int gcd(int a,int b)//求最大公约数
{
return a%b==0?b:gcd(b,a%b);//辗转相除法
}
int main()
{
vector<int>v;
bool book[1010000];
memset(book,0,sizeof(book));
book[1]=1;
for(int i=2; i<=1000100; i++)//素数筛
if(!book[i])
{
v.push_back(i);//储存素数
for(int j=i*2; j<=1000100; j=j+i)
book[j]=1;
}
int t,z=1,flag=0;
long long n;
scanf("%d",&t);
while(t--)
{
flag=0;
scanf("%lld",&n);
if(n<0)
{
n=n*-1;
flag=1;
}
int ans=0;
for(int i=0; i<v.size()&&v[i]*v[i]<=n; i++)
{
if(n%v[i]==0)
{
int tt=0;
while(n%v[i]==0)
{
n=n/v[i];
tt++;
}
if(ans==0)//第一次求最大公约数
ans=tt;
else
ans=gcd(ans,tt);// x=b^p p=gcd(a1,a2,a3...,an)
}
}
if(n > 1)//存在n>1时 指数的最大公约数为1 n此时为素数
ans = gcd(ans, 1);
if(flag == 1)
{
while(ans % 2 == 0)
ans >>= 1;
}
printf("Case %d: %d\n",z++,ans);
}
return 0;
}

LightOJ - 1341 Aladdin and the Flying Carpet 唯一分解定理LightOJ 1220Mysterious Bacteria的更多相关文章

  1. LightOJ 1341 - Aladdin and the Flying Carpet (唯一分解定理 + 素数筛选)

    http://lightoj.com/volume_showproblem.php?problem=1341 Aladdin and the Flying Carpet Time Limit:3000 ...

  2. LightOJ1341 Aladdin and the Flying Carpet —— 唯一分解定理

    题目链接:https://vjudge.net/problem/LightOJ-1341 1341 - Aladdin and the Flying Carpet    PDF (English) S ...

  3. LightOJ 1341 Aladdin and the Flying Carpet(唯一分解定理)

    http://lightoj.com/volume_showproblem.php?problem=1341 题意:给你矩形的面积(矩形的边长都是正整数),让你求最小的边大于等于b的矩形的个数. 思路 ...

  4. LightOJ 1341 Aladdin and the Flying Carpet 数学

    题意:给个矩形的面积a,和矩形的最小边长b,问有多少种矩形的方案(不能是正方形) 分析:a可以写成x,y,因为不能是正方形,所以设x<y,那么x<sqrt(a),y>sqrt(a) ...

  5. [LightOJ 1341] Aladdin and the Flying Carpet (算数基本定理(唯一分解定理))

    题目链接: https://vjudge.net/problem/LightOJ-1341 题目描述: 问有几种边长为整数的矩形面积等于a,且矩形的短边不小于b 算数基本定理的知识点:https:// ...

  6. LightOJ 1341 - Aladdin and the Flying Carpet 基本因子分解

    http://www.lightoj.com/volume_showproblem.php?problem=1341 题意:给你长方形的面积a,边最小为b,问有几种情况. 思路:对a进行素因子分解,再 ...

  7. LightOJ 1341 - Aladdin and the Flying Carpet

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1341 题意:给你地毯面积和最小可能边的长度,让你求有几种组合的可能. 题解:这题就厉害 ...

  8. LightOJ 1341 Aladdin and the Flying Carpet【整数分解】

    题目链接: http://lightoj.com/login_main.php?url=volume_showproblem.php?problem=1341 题意: 给定一个数,将其拆分成两个数的乘 ...

  9. LightOJ 1341 Aladdin and the Flying Carpet 算数基本定理

    题目大意:给出面积n,和最短边m,求能形成的矩形的个数(不能为正方形). 题目思路:根据算数基本定理有: 1.每个数n都能被分解为:n=p1^a1*p2^a2*^p3^a3……pn^an(p为素数); ...

随机推荐

  1. C++走向远洋——55(项目一3、分数类的重载、>>

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...

  2. git问题待更新

    git pull failed 错误解决 情况: 刚开始的项目,需要创建一个项目,然后pull从远端的项目,创建分支dev,然后从dev分支开始拉取远端的代码 出现错误,说git pull faile ...

  3. Ubuntu 18.04 国内的 apt 源

    一.Ubuntu 18.04 国内的 apt 源 1. 阿里源 deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted univers ...

  4. vue自定义指令要点

    vue自定义指令的基础使用这里就不阐述,看官网文档:https://cn.vuejs.org/v2/guide/custom-directive.html 本文用一个实例描述自定义指令的要点,自定义一 ...

  5. 俊哥的blog的一道题

    题目: 实现一个person对象,有eat和dinner两种方法 请用实例[依次类推] new person('Tom').sleep(10).eat('dinner'); //输出 console. ...

  6. racket学习-call/cc (let/cc)

    Drracket continuation 文中使用let/cc代替call/cc Racket文档中,let/cc说明为: (let/cc k body ...+) Equivalent to (c ...

  7. java开发——Cloneable接口、clone()方法和深浅拷贝

    1.实现Cloneable接口表明该类的对象是允许克隆的. 2.允许克隆的意思是:可以调用clone()方法. 3.深拷贝还是浅拷贝,取决于如何重写Object的clone()方法. 4.原对象和克隆 ...

  8. 五分钟用Docker快速搭建Go开发环境

    挺早以前在我写过一篇用 `Docker`搭建LNMP开发环境的文章:[用Docker搭建Laravel开发环境](http://mp.weixin.qq.com/s?__biz=MzUzNTY5MzU ...

  9. C++ 函数模板/类模板

    #include <iostream> #include <vector> using namespace std; template < class T > // ...

  10. 【BIM】BIMFACE中创建矢量文本[下篇]

    背景 在上一篇文章中,我们通过THREEJS创建了矢量文本,并添加到了BIMFACE场景中,但是仅仅加入到场景中并不是我们的目的,我们的目的是把这种矢量文本加到指定的构件或者空间上,以此标识该构件或空 ...