Aladdin and the Flying Carpet LightOJ - 1341
题目链接: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相关推荐
- Aladdin and the Flying Carpet (素数打表+正整数的唯一分解定理,找因数对)
题目大意:给两个数a,b,求满足c*d==a且c>=b且d>=b的c,d二元组对数,(c,d)和(d,c)属于同一种情况 题目分析:根据唯一分解定理先将a唯一分解,则a的所有正约数的个数为 ...
- Aladdin and the Flying Carpet(唯一分解定理)
传送门 It's said that Aladdin had to solve seven mysteries before getting the Magical Lamp which summon ...
- LightOJ - 1341 Aladdin and the Flying Carpet(数论)
题意 有一块矩形(也可能是正方形)的飞毯. 给定飞毯的面积\(n\)和最小可能的边长\(a\),求可能有多少种不同边长的飞毯.(\(1<=a<=n<=1e12\)) 如面积\(n=6 ...
- C - Aladdin and the Flying Carpet(数论结论+思维)
这道题应该是我的反思题. 千万自己要注意,如果一个数n没有被完全分解,答案千万要记得ans*=2因为还有一个比1e6更大的素数存在作为他的因子!! 我明明找到了a的约数个数/2-a在b一下的约数个数= ...
- 【light 1341Aladdin and the Flying Carpet】
给你矩形的面积(矩形的边长都是正整数),让你求最小的边大于等于b的矩形的个数. 肯定是和面积的因子有关系了,边长都是面积值的 因子. 那么就可以算出面积值得所有因子,因为是让求得矩形得个数,当然是要& ...
- 紫薯第10章数学 kaungbin专题14数论基础
杂谈 kuangbin14数论Harmonic Number LightOJ - 1234 分段打表 + 欧拉爷爷o(1).(第一次触及了欧拉常熟) 10.1.1 && 10.1.2 ...
- 19级HPU算法协会公开课第三期: 【基础数学】 题解
基础数学[数论] A - Bi-shoe and Phi-shoe (LightOJ - 1370) 分析 代码 B - Aladdin and the Flying Carpet (LightOJ ...
- kuangbin带你飞专题合集
题目列表 [kuangbin带你飞]专题一 简单搜索 [kuangbin带你飞]专题二 搜索进阶 [kuangbin带你飞]专题三 Dancing Links [kuangbin带你飞]专题四 最短路 ...
- 算法学习经典例题整理
陆续会对本篇博客进行更新! 搜索:https://vjudge.net/contest/292597 区间DP:https://vjudge.net/contest/293892 树状背包:https ...
- kuangbin带你飞 专题1-23 题单
kuangbin大神,对于打过ACM比赛的ACMer,无人不知无人不晓. 在此,附上vjudge平台上一位大神整理的[kuangbin带你飞]专题目录链接. [kuangbin带你飞专题目录1-23] ...
最新文章
- 概念炒作的背后,“智能合约”的真相是什么?
- linux 逆向工具 radare2入门
- JavaScript 复习之 Array 对象
- Java中NaN和-0.0f的比较问题
- 华为ipc配置工具_【简讯】Intel十代桌面10核心亮相;Redmi K30配置曝光…
- 使用 Windows PowerShell 实现 Web UI 自动化
- 数据库毗连过多的错误,年夜概的启事分解及措置惩罚行动
- jzoj6804-NOIP2020.9.26模拟jerry【dp】
- JPDA 架构研究5 - Agent利用环境指针访问VM (内存管理篇)
- InfoQ中文站2015年度优秀社区编辑评选揭晓
- sqldeveloper mysql迁移_通过SQL Developer工具将MySQL数据库内容迁移至Oracle的步骤
- 中交国通智能科技 招募 AI目标识别技术顾问
- Using Apache Solr‘s boost query function with Spring in Java
- poj2406Power string
- 在Ubuntu搭建网站环境问题记录
- 深度学习实现缺陷检测算法汇总
- bing翻译api php,免费翻译接口
- Popclip的JSON格式化扩展
- python xlwt_【已解决】Python中使用xlwt设置cell的背景色
- 怎样用计算机命令提高网速,老司机教你电脑网速慢怎么办
热门文章
- Sisvel和RPX签署Wi-Fi标准必要专利许可协议
- linux 提取网卡驱动,linux(ubuntu18.04)系统上安装RTL8822CE网卡驱动
- 计算机硬盘 打开很慢,电脑读写运行速度慢的8种解决办法
- liang-Barskey算法
- 华为云会议的前世今生
- big O notation - 大 O 表示法
- php 获取当前、两个月之前的日期
- 科罗拉多州立大学计算机优势,科罗拉多州立大学——一所你可能不了解的好学校...
- excel随机数_利用excel快速凭空制造大量随机数据?想要制造什么数据都可以
- matlab 双均线,[转载]百年一人的双均线系统及双均线系统公式