题目链接:https://vjudge.net/problem/LightOJ-1341
思路:开始想了n\sqrt{n}n​的暴力算法,发现复杂度大概在4e9显然不能过。考虑分解质因数(试除法复杂度也不够,Pollard Rho 算法 n1/4n^{1/4}n1/4复杂度可行),我们对分解完的质因数进行dfs枚举原数中所有因数(因数个数期望位ln(n)ln(n)ln(n)),进行计数。复杂度期望O(n1/4+ln(n))O(n^{1/4}+ln(n))O(n1/4+ln(n))。
代码:

#include<bits/stdc++.h>
#define ll long long
#define fi first
#define se second
using namespace std;
ll max_factor;
struct BigIntegerFactor {const static int N = 1e6 + 7;const static ll inf=0x3f3f3f3f3f3f3f3f;ll prime[N], p[N], fac[N], sz, cnt; //多组输入注意初始化cnt = 0inline ll mul(ll a, ll b, ll mod) {          //WA了尝试改为__int128或慢速乘if (mod <= 1000000000)return a * b % mod;return (a * b - (ll)((long double)a / mod * b + 1e-8) * mod + mod) % mod;}void init(int maxn) //线性筛 {int tot = 0;sz = maxn - 1;for (int i = 1; i <= sz; ++i)p[i] = i;for (int i = 2; i <= sz; ++i) {if (p[i] == i)prime[tot++] = i;for (int j = 0; j < tot && 1ll * i * prime[j] <= sz; ++j) {p[i * prime[j]] = prime[j];if (i % prime[j] == 0)break;}}}ll qpow(ll a, ll x, ll mod){ll res = 1ll;while (x) {if (x & 1)res = mul(res, a, mod);a = mul(a, a, mod);x >>= 1;}return res;}bool check(ll a, ll n) {                     //二次探测原理检验nll t = 0, u = n - 1;while (!(u & 1))t++, u >>= 1;ll x = qpow(a, u, n), xx = 0;while (t--) {xx = mul(x, x, n);if (xx == 1 && x != 1 && x != n - 1)return false;x = xx;}return xx == 1;}bool miller(ll n, int k) {if (n == 2)return true;if (n < 2 || !(n & 1))return false;if (n <= sz)return p[n] == n;for (int i = 0; i <= k; ++i) {            //测试k次if (!check(rand() % (n - 1) + 1, n))return false;}return true;}inline ll gcd(ll a, ll b) {return b == 0 ? a : gcd(b, a % b);}inline ll Abs(ll x) {return x < 0 ? -x : x;}ll Pollard_rho(ll n) {                 //基于路径倍增的Pollard_Rho算法ll s = 0, t = 0, c = rand() % (n - 1) + 1, v = 1, ed = 1;while (1) {for (int i = 1; i <= ed; ++i) {t = (mul(t, t, n) + c) % n;v = mul(v, Abs(t - s), n);if (i % 127 == 0) {ll d = gcd(v, n);if (d > 1)return d;}}ll d = gcd(v, n);if (d > 1)return d;s = t;v = 1;ed <<= 1;}}void getfactor(ll n) {                         //得到所有的质因子(可能有重复的)if (n <= sz) {while (n != 1)fac[cnt ++ ] = p[n], n /= p[n];max_factor = max_factor > p[n] ? max_factor : p[n];return;}if (miller(n, 6)) {fac[cnt ++ ] = n;max_factor = max_factor > n ? max_factor : n;}else {ll d = n;while (d >= n)d = Pollard_rho(n);getfactor(d);getfactor(n / d);}return ;}ll ans,num;pair<ll,ll> pp[N];void dfs(ll x,ll a,ll b,ll now){if(x>=num){//printf("ans:%lld %lld %lld\n",x,now,a/now);if(min(now,a/now)>=b){if(now!=a/now) ans++;//else ans+=2;//(注意不能是正方形)}return ;}dfs(x+1,a,b,now);for(int i=1;i<=pp[x].se;i++){now*=pp[x].fi;dfs(x+1,a,b,now);}}//这样写不太好初始化。。。。WA了好久 ll slove(ll a,ll b){cnt=0;ans=0;num=0;getfactor(a);sort(fac,fac+cnt);fac[cnt]=-1;pp[num].se=0;for(int i=0;i<=cnt;i++){pp[num].fi=fac[i];pp[num].se++;if(fac[i]!=fac[i+1]){num++;pp[num].se=0;}}dfs(0,a,b,1);return ans/2;}
}Q;int main()
{ll t;scanf("%lld",&t);ll cas=0;while(t--){ll a,b;scanf("%lld%lld",&a,&b);if(a==1||b>a/b){printf("Case %lld: 0\n",++cas);continue;}printf("Case %lld: %lld\n",++cas,Q.slove(a,b));}
}

Aladdin and the Flying Carpet LightOJ - 1341相关推荐

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

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

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

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

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

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

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

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

  5. 【light 1341Aladdin and the Flying Carpet】

    给你矩形的面积(矩形的边长都是正整数),让你求最小的边大于等于b的矩形的个数. 肯定是和面积的因子有关系了,边长都是面积值的 因子. 那么就可以算出面积值得所有因子,因为是让求得矩形得个数,当然是要& ...

  6. 紫薯第10章数学 kaungbin专题14数论基础

    杂谈 kuangbin14数论Harmonic Number LightOJ - 1234 分段打表 + 欧拉爷爷o(1).(第一次触及了欧拉常熟) 10.1.1 && 10.1.2 ...

  7. 19级HPU算法协会公开课第三期: 【基础数学】 题解

    基础数学[数论] A - Bi-shoe and Phi-shoe (LightOJ - 1370) 分析 代码 B - Aladdin and the Flying Carpet (LightOJ ...

  8. kuangbin带你飞专题合集

    题目列表 [kuangbin带你飞]专题一 简单搜索 [kuangbin带你飞]专题二 搜索进阶 [kuangbin带你飞]专题三 Dancing Links [kuangbin带你飞]专题四 最短路 ...

  9. 算法学习经典例题整理

    陆续会对本篇博客进行更新! 搜索:https://vjudge.net/contest/292597 区间DP:https://vjudge.net/contest/293892 树状背包:https ...

  10. kuangbin带你飞 专题1-23 题单

    kuangbin大神,对于打过ACM比赛的ACMer,无人不知无人不晓. 在此,附上vjudge平台上一位大神整理的[kuangbin带你飞]专题目录链接. [kuangbin带你飞专题目录1-23] ...

最新文章

  1. 概念炒作的背后,“智能合约”的真相是什么?
  2. linux 逆向工具 radare2入门
  3. JavaScript 复习之 Array 对象
  4. Java中NaN和-0.0f的比较问题
  5. 华为ipc配置工具_【简讯】Intel十代桌面10核心亮相;Redmi K30配置曝光…
  6. 使用 Windows PowerShell 实现 Web UI 自动化
  7. 数据库毗连过多的错误,年夜概的启事分解及措置惩罚行动
  8. jzoj6804-NOIP2020.9.26模拟jerry【dp】
  9. JPDA 架构研究5 - Agent利用环境指针访问VM (内存管理篇)
  10. InfoQ中文站2015年度优秀社区编辑评选揭晓
  11. sqldeveloper mysql迁移_通过SQL Developer工具将MySQL数据库内容迁移至Oracle的步骤
  12. 中交国通智能科技 招募 AI目标识别技术顾问
  13. Using Apache Solr‘s boost query function with Spring in Java
  14. poj2406Power string
  15. 在Ubuntu搭建网站环境问题记录
  16. 深度学习实现缺陷检测算法汇总
  17. bing翻译api php,免费翻译接口
  18. Popclip的JSON格式化扩展
  19. python xlwt_【已解决】Python中使用xlwt设置cell的背景色
  20. 怎样用计算机命令提高网速,老司机教你电脑网速慢怎么办

热门文章

  1. Sisvel和RPX签署Wi-Fi标准必要专利许可协议
  2. linux 提取网卡驱动,linux(ubuntu18.04)系统上安装RTL8822CE网卡驱动
  3. 计算机硬盘 打开很慢,电脑读写运行速度慢的8种解决办法
  4. liang-Barskey算法
  5. 华为云会议的前世今生
  6. big O notation - 大 O 表示法
  7. php 获取当前、两个月之前的日期
  8. 科罗拉多州立大学计算机优势,科罗拉多州立大学——一所你可能不了解的好学校...
  9. excel随机数_利用excel快速凭空制造大量随机数据?想要制造什么数据都可以
  10. matlab 双均线,[转载]百年一人的双均线系统及双均线系统公式