首页 > 其他分享 >【P8302 题解】

【P8302 题解】

时间:2023-07-24 19:33:06浏览次数:35  
标签:P8302 int 题解 mid times 因子 nmid minp

Solution

设 \(g(x)\) 表示 \(x\) 的最小质因子

则 \(f(x)=n+\dfrac{n}{g(x)}=\dfrac{g(x)+1}{g(x)}\times n\)。

分情况讨论:

  • \(g(x)=2\),经过 \(1\) 次变换之后,\(f(x)\) 增加了一个因子 \(3\),减少了一个因子 \(2\)。

  • \(g(x)>2\),则满足 \(g(x)\nmid 2\),否则与最小质因子矛盾,经过 \(1\) 次变化之后,\(f(x)\) 增加一个因子 \(2\)。

设 \(n=2^p\times x\) 且 \(2\nmid x\),经过 \(p\) 次操作,\(n=3^p\times x\),再经过 \(1\) 次操作,\(n=2^2\times 3^{p-1}\times x\),再经过 \(2\) 次操作后,\(n=3^{p+1}\times x\),我们发现,\(n=3^p\times x\) 后,每 \(3\) 次操作一循环。

如果 \(m\) 不在循环中,因为 \(2\) 的因子一定是单调递减的,所以一定不满足 \(f^{(m)}(n)\mid f^{(m+k)}(n)\)。

如果 \(m\) 在循环中,那么当且仅当 \(k=3q, q\in\mathbb{Z}\),满足 \(f^{(m)}(n)\mid f^{(m+k)}(n)\),手玩一下即可。

综上,\(3\mid k\) 是有解的充分必要条件。

考虑如何求出最小的自然数 \(m_0\)。

也就是求出循环的开始位置。

如果一个数 \(n=2^p\times x, 2\nmid x\) 在循环里,则满足 \(0\le p\le 2\)。

  • \(2\nmid n, 3\nmid n\),先进行一次操作,将 \(n\to n+\dfrac{n}{minp_n}\),其中 \(minp_n\) 表示 \(n\) 的最小质因子,再进行如下操作。

  • \(2\mid n\),\(n=2^p\times x\),其中 \(2\nmid x\),需要进行 \(\max\{0,p-2\}\) 次操作将 \(p\) 变成 \(2^{\min\{2, p\}}\times x\),此时 \(n\) 已经在循环内。

  • \(2\nmid n, 3\mid n\),\(n\) 本身已经在循环内,不用操作。

\(minp\) 可以用线性筛法 \(\mathcal O(n)\) 求出。

时间复杂度为:\(\mathcal O(n+T\log n)\)。

代码:

#include <bits/stdc++.h>

using i64 = long long;

constexpr int N = 30000010;

std::vector<int> minp, primes;
 
void sieve(int n) {
    minp.assign(n + 1, 0);
    primes.clear();

    for (int i = 2; i <= n; i ++ ) {
        if (minp[i] == 0) {
            minp[i] = i;
            primes.push_back(i);
        }

        for (auto p : primes) {
            if (i * p > n) {
                break;
            }
            minp[i * p] = p;
            if (p == minp[i]) {
                break;
            }
        }
    }
}

void solve() {
	int n, k;
	std::cin >> n >> k;
	if (k % 3) {
		std::cout << -1 << "\n";
		return;
	}

	if (n % 2 && n % 3 == 0) {
		std::cout << 0 << "\n";
		return;
	}

	int x = -2, y = 0;
	if (n % 2 && n % 3) {
		n = n / minp[n] * (minp[n] + 1);
		y ++ ;
	}

	while (n % 2 == 0) {
		x ++ ;
		n /= 2;
	}
	std::cout << std::max(0, x) + y << "\n";
}

int main() {
	std::ios::sync_with_stdio(false);
	std::cin.tie(nullptr), std::cout.tie(nullptr);

	sieve(N);

	int t;
	std::cin >> t;

	while (t -- ) {
		solve();
	}

	return 0;
}

标签:P8302,int,题解,mid,times,因子,nmid,minp
From: https://www.cnblogs.com/hcywoi/p/17578121.html

相关文章

  • 【题解】Ntarsis' Set - Codeforces 1852A
    出处:CodeforcesRound887链接:https://codeforces.com/problemset/problem/1852/A题目大意:给定一个包含\(n\)个正整数的表示删除位置的严格升序序列\(p\),以及另外一个连续正整数的被删除的无穷序列\(l\)。进行\(k\)次删除操作,每次操作从无穷序列\(l\)中同时删除位......
  • Codeforces Round 887 (Div. 1) 题解
    https://codeforces.com/contest/1852/problemsA.Ntarsis'Sethttps://codeforces.com/contest/1852/problem/A感觉不是很一眼。\(n\)和\(k\)都是\(2\times10^5\),不能暴力,设当前集合为\({1,2,\dots,10^{1000}}\),那么被操作过一次的最小值就应该是\(\text{MEX}(0,......
  • 国标GB28181视频平台LntonGBS(含源码)国标视频平台播放视频时偶尔出现播放失败的问题解
    LntonGBS是基于公安部推出的安防主流协议(国标GB28181协议)的视频接入、处理及分发平台,具有视频直播监控、云端录像、云存储、检索回放、智能告警、语音对讲等功能,能够涵盖所有监控领域的视频能力需求,已经在大量的项目中落地应用,如明厨亮灶、平安乡村、雪亮工程等。有用户反馈,在某项......
  • P7831 题解
    problem&blog。妙妙题。单杀了,来写篇题解。下文中\(ans_u\)表示从\(u\)点出发的答案。考虑直接做。发现更新任何一个点,都可能会对一堆点造成影响,\(O(n^2)\)无法接受。一些简单的性质:不能进入一个环的\(ans_u=-1\)。否则,对于\((u,v,r,p)\),\(r\)是最大的\(r\),那么只......
  • AT_abc218_d 题解
    洛谷链接&Atcoder本篇题解为此题较简单做法及较少码量,并且码风优良,请放心阅读。题目简述给定一个平面内的\(N\)个点的坐标,求这\(N\)个点中选\(4\)个点可构成正方形的方案数。注:构成的正方形的边需平行于\(x\)轴或\(y\)轴。例如下图就不符合要求,则不考虑这种情况:......
  • AT_abc215_d 题解
    洛谷链接&Atcoder链接本篇题解为此题较简单做法及较少码量,并且码风优良,请放心阅读。题目简述给定\(N\),\(M\)及含有\(N\)个整数的序列\(A\)。求\(1\simM\)中与所有\(a_i\)均互质的整数及个数。思路首先说一下最开始的想法。直接暴力枚举\(1\simM\)的数,再分......
  • 仪酷LabVIEW AI视觉工具包及开放神经网络交互工具包常见问题解答
    前言哈喽,各位朋友,好久不见~之前给大家分享了基于LabVIEW开发的AI视觉工具包及开放神经网络交互工具包,不少朋友私信说在安装和使用过程中会遇到一些问题,今天我们就集中回复一下大家问到最多的问题。如果大家在使用过程中还有其他问题,可以补充到评论区,我们这篇博文会持续补充更新......
  • 「题解」Codeforces Round 887 (Div. 2)
    A.DesortingProblem题目Sol&Code若序列一开始无序答案为\(0\)若有序即\(a_1\leqa_2\leq\dots\leqa_n\)。若想让\(a_i>a_j(i<j)\),操作次数与两数差值\(d(d=a_j-a_i)\)相关为\(\lfloor\dfrac{d}{2}\rfloor+1\),差值越小操作次数越少,故枚举相邻两数取最少......
  • 洛谷AT_jsc2019_qual_e Card Collector 题解
    题目链接CardCollector-洛谷|计算机科学教育新生态(luogu.com.cn)思路将每一行、每一列转化为点,第i行第j列的卡牌转化为i->j+m(m为行数)的有向边。总共会抽取m+n(m为行数,n为列数)张牌,每个点的出度为1。结果图为基环森林;那么题目就转化为求最大基环森林。代码1#include......
  • 牛客小白月赛 47 题解
    牛客小白月赛47A.牛牛的装球游戏标签暴力思路显然,答案为\(\pir^2l-[\frac{l}{2r}]*\frac{4\pir^3}{3}\)。时间复杂度为\(\mathcalO(1)\)。代码点击查看代码#include<bits/stdc++.h>usingnamespacestd;intT;doubleans,pi=3.141592653589;intt,h,r;int......