题意:a*b=S,给S 和一条边的最小长度,求多少种组合

有一个矩形的毯子,已知它一定不是正方形,并且已知最短边和毯子的面积,求这个毯子可能有多少种形状。

分析:首先,如果最短的边大于等于面积的平方根,两个大于面积平方根的边不可能组成面积等于给定面积的矩形。

所以这种情况是0. 然后最短边的范围就变成了1-1e6,问题也变成了在最短边(min_side)到面积(area)这些数中有多少对不同的数相乘等于面积(area)。可以转变为1-area中不同的数相乘为area的对数,再减去1-min_side-1中不同的数相乘为area的对数。然后利用算术基本定理中的(1)算出1-area中的正因数的个数,正因数关于sqrt(area)对称,每对称的两个相乘是area,因此只要因数的个数除以二就行啦,向下取整,正好也不会算上平方根。再就是1-min_side-1中的对数,暴力就行啦。(下图是转的)


相关知识:

1.有多少个约数:

先分解质因数
因数的次数分别是4,2,1

所以约数的个数为(4+1)*(2+1)*(1+1)=5*3*2=30个

eg:

先分解质因数

720=24*32*51

因数的次数分别是4,2,1

所以约数的个数为(4+1)*(2+1)*(1+1)=5*3*2=30个

2.所有约数之和:

2004的约数之和为:1, 2, 3, 4, 6, 12, 167, 334, 501, 668, 1002 ,2004  = 4704

如何求一个数所有约数之和呢?

首先,应用算术基本定理,化简为素数方幂的乘积。

X = a1^k1 * a2^k2........an^kn

X的所有素数之和可用公式(1+a1 + a1^2...a1^k1) * (1+a2 + a2^2...a2^k2) * .....(1+an + an^2...an^kn)表示

如:

2004 = 2^2  * 3  *167

2004所有因子之和为(1  + 2 + 2^2) * (1 + 3) * ( 1 + 167) = 4704;

程序实现的时候,可利用等比数列快速求1 + a1 + a1^2 + .....a1^n;


思路:

求出它的每个质因子的个数,然后用公式求出它的约数个数。如果b * b > a,那么值一定为0,其余部分可以枚举b,删除。但是我觉得枚举应该会挂掉,

但是竟然没有挂。。


代码:

#include<stdio.h>
#include<string.h>
const int MAXN=1000100;
bool vis[MAXN];
long long prime[MAXN/10];
int tot=0;
void getPrime()//ÇóËØÊý
{for(long long i=2;i<MAXN;i++)if(!vis[i]){prime[tot++]=i;for(long long j=i*i;j<MAXN;j+=i) vis[j]=true;}
}
int a[1000];//±£´æËØÒò×Ó
int b[1000];//±£´æËØÒò×ӵĸöÊý
int cnt;
void sbreak(long long n){//½øÐÐËØÒò×Ó·Ö½âmemset(a,0,sizeof(a));memset(b,0,sizeof(b));cnt=0;for(int i=0;prime[i]*prime[i]<=n;i++){if(n%prime[i]==0){a[cnt]=prime[i];while(n%prime[i]==0){b[cnt]++;n/=prime[i];}cnt++;}}if(n!=1){a[cnt]=n;b[cnt++]=1;}
}int gcd(int a,int b)  //Çó×î´ó¹«Ô¼Êý
{return b?gcd(b,a%b):a;
}int main(){int T,ans,kase=0,flag;long long n;getPrime();scanf("%d",&T);while(T--){flag=1;//±êÖ¾£¬ÅжÏnÊÇÕýÊý»¹ÊǸºÊýscanf("%lld",&n);if(n<0) n=-n,flag=0;sbreak(n);int t=b[0];if(!flag){//Èç¹ûnÊÇÆæÊýif(t%2==0){while(t%2==0) t/=2;}for(int i=0;i<cnt;i++){//½«ËüµÄËØÒò×ӵĸöÊý»¯ÎªÆæÊýif(b[i]%2==0){while(b[i]%2==0) b[i]/=2;}t=gcd(t,b[i]);}}else for(int i=0;i<cnt;i++)  t=gcd(t,b[i]);printf("Case %d: %d\n",++kase,t);}return 0;
}

法二

#include<bitset>
#include<map>
#include<vector>
#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<stack>
#include<queue>
#include<set>
#define inf 0x3f3f3f3f
#define mem(a,x) memset(a,x,sizeof(a))using namespace std;typedef long long ll;
typedef pair<int,int> pii;inline ll in()
{ll res=0;char c;while((c=getchar())<'0' || c>'9');while(c>='0' && c<='9')res=res*10+c-'0',c=getchar();return res;
}
const int N=1000010;
int prime[79000];
bitset<N> vis;
int p;void init()
{for(int i=2;i<N;i++){if(!vis[i]){prime[p++]=i;for(int j=i+i;j<N;j+=i){vis[j]=1;}}}
}
int main()
{int T=in();int ii=1;init();while(T--){ll area=in(),min_side=in();if(min_side>=sqrt(area)){printf("Case %d: %d\n",ii++,0);continue;}ll tmp=area;int ans=1;for(int i=0;i<p && 1LL*prime[i]*prime[i]<=area;i++){int cnt=0;while(area%prime[i] == 0){area/=prime[i];cnt++;}ans*=(cnt+1);}if(area!=1) ans<<=1;ans>>=1;  //因数的个数除以二就是组数,同时排除了平方根for(int i=1;i<min_side;i++) if(tmp%i==0) ans--; //min_side此时是小于sqrt(area)的printf("Case %d: %d\n",ii++,ans);}return 0;
}

LightOJ - 1341 Aladdin and the Flying Carpet 唯一分解定理相关推荐

  1. LightOJ - 1341 Aladdin and the Flying Carpet(数论)

    题意 有一块矩形(也可能是正方形)的飞毯. 给定飞毯的面积\(n\)和最小可能的边长\(a\),求可能有多少种不同边长的飞毯.(\(1<=a<=n<=1e12\)) 如面积\(n=6 ...

  2. Aladdin and the Flying Carpet (素数打表+正整数的唯一分解定理,找因数对)

    题目大意:给两个数a,b,求满足c*d==a且c>=b且d>=b的c,d二元组对数,(c,d)和(d,c)属于同一种情况 题目分析:根据唯一分解定理先将a唯一分解,则a的所有正约数的个数为 ...

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

    传送门 It's said that Aladdin had to solve seven mysteries before getting the Magical Lamp which summon ...

  4. C - Aladdin and the Flying Carpet(数论结论+思维)

    这道题应该是我的反思题. 千万自己要注意,如果一个数n没有被完全分解,答案千万要记得ans*=2因为还有一个比1e6更大的素数存在作为他的因子!! 我明明找到了a的约数个数/2-a在b一下的约数个数= ...

  5. LightOJ - 1236 (唯一分解定理)

    题意:求有多少对数对(i,j)满足lcm(i,j) = n,1<=i<=j, 1<=n<=1e14. 分析:根据整数的唯一分解定理,n可以分解为(p1^e1)*(p2^e2)* ...

  6. lightoj 1236 正整数唯一分解定理

    A - (例题)整数分解 Crawling in process... Crawling failed Time Limit:2000MS     Memory Limit:32768KB     6 ...

  7. LightOJ 1220 Mysterious Bacteria(唯一分解定理) (素数筛)

    题干: 给你一个整数x,令x= b p b^p bp(b,p都为整数),求p的最大值. x为32位有符号整型. 思路: 首先,素数因为不能被除1和它自身外整除,所以x为素数时p=1: x为合数时,根据 ...

  8. 阿拉丁和飞毯(唯一分解定理&因数个数求和+素筛)

    我是传送门 It's said that Aladdin had to solve seven mysteries before getting the Magical Lamp which summ ...

  9. 唯一分解定理一篇就够了

    如果与唯一定理一起应用需要用到素数筛,可以看这篇文章: 线性筛判断素数 唯一分解定理: 任何一个大于1的自然数 N,如果N不为质数,**那么N可以唯一分解成有限个质数的乘积: 这里P1<P2&l ...

  10. 欧几里得算法与唯一分解定理

    整理的算法模板合集: ACM模板 目录 最大公约数与最大公倍数 唯一分解定理 快速分解质因子 最大公约数与最大公倍数 最多O(logn)O(logn)O(logn) int gcd(int a, in ...

最新文章

  1. Linux如何查看当前目录下文件的个数
  2. 机器学习模型部署都有哪些坑?剑桥研究者梳理了99篇相关研究
  3. Netty面试题 汇总
  4. pytorch 损失函数总结
  5. python json dumps utf8_Python2操作JSON出现乱码的解决方案
  6. 分布式为什么使用Redis
  7. Beetl学习总结(3)——高级功能
  8. JavaScript 颜色梯度和渐变效果
  9. Resharper F12下载dll源码
  10. react前端封装接口弹出错误_react+ts打包发布后报Minified React error ..这种错误
  11. 基于Vue.js 2.x系列 + Element UI + RBAC/AUTH权限 的响应式后台管理系统
  12. win10 安装oracle 11gR2_database出现universal Installer后闪退就没反应的解决方案
  13. 标签打印软件中Excel数据整理及导入
  14. 微软api的word在线预览
  15. mysql front 垃圾_MySQL_Front 的缺点
  16. 2021年微信小程序应用开发大赛华南赛区获奖作品---《课室帮》上
  17. 苹果电脑双系统正确打开方式,虚拟机已经Out了
  18. iOS10.3.3 iPhone5使用爱思助手越狱后安装完openssl,afc2失效的解决办法
  19. 学习记录 重叠网络权威知识——多尺度复杂网络社区发现的链接
  20. switch()的参数注意项(转)

热门文章

  1. java 死循环排查_java2如何排查线上死循环
  2. hdu 3689 Infinite monkey theorem
  3. 谷歌翻译停服后,chrome无法自动翻译?解决办法来了~
  4. 路由器密码破解:路由器登陆密码破解方法(仅用于丢失密码后
  5. 做过的医药类DA及产品宣传单页
  6. 图片隐写,盲水印,加密logo
  7. Node版本管理控制器n
  8. vs2019下载安装
  9. 存储专栏:深度解读高端存储的快照技术
  10. eMTC是什么技术?