CF1076B Divisor Subtraction 题解
Content
给定一个数 \(n\),执行如下操作:
- 如果 \(n=0\) 结束操作。
- 找到 \(n\) 的最小质因子 \(d\)。
- \(n\leftarrow n-d\) 并跳到操作 \(1\)。
请求出循环操作的次数。
数据范围:\(2\leqslant n\leqslant 10^{10}\)。
Solution
首先我们看是否是素数,如果是素数的话,那么其最小质因子一定是它本身,那么答案就是 \(1\)。
如果不是素数,我们再根据奇偶性来分类讨论。由于偶数的情况比较简单,我们先讨论 \(n\) 是偶数的情况。很显然,其最小质因子一定是 \(2\),并且因为减完以后还是偶数,所以一定会不停地减 \(2\),所以答案就是 \(\dfrac{n}{2}\)。
最后再看到奇合数,我们找到一个最小的质因子 \(d'\) 之后减去,因为奇合数一定都是由奇质数相乘得到,所以找到的最小质因子也一定是奇数,而我们都知道,奇数减奇数等于偶数,所以就又回到了偶数的情况了,所以答案就是 \(\dfrac{n-d'}{2}+1\)。
由于 \(n\leqslant 10^{10}\),所以我们判断 \(n\) 是否是素数可以直接用 \(\mathcal{O}(\sqrt{n})\) 的试除法判断是否是素数,然后看最小质因子时,可以先用埃氏筛筛出 \(10^5\) 以内的素数,然后再去一个一个找最小的质因子即可,并且可以证明,寻找最小质因子最多只需要 \(1\) 次,所以复杂度可以算得上很优秀的了。
Code
long long n;
int isprime[100007];
bool prime(long long x) {
for(int i = 2; i <= sqrt(x); ++i)
if(!(x % i)) return 0;
return 1;
}
void pre() {
for(int i = 2; i <= 100000; ++i) isprime[i] = 1;
for(int i = 2; i <= 100000; ++i)
if(isprime[i])
for(int j = i * 2; j <= 100000; j += i)
isprime[j] = 0;
}
void work(long long x) {
pre();
for(int i = 2; i <= sqrt(x); ++i)
if(!(x % i) && isprime[i]) {
if(x % 2) printf("%lld", (x - i) / 2 + 1);
else printf("%lld", x / 2);
return;
}
return;
}
int main() {
scanf("%lld", &n);
if(prime(n)) printf("1");
else work(n);
}
CF1076B Divisor Subtraction 题解的更多相关文章
- Divisor Subtraction
Description You are given an integer number nn. The following algorithm is applied to it: if n=0, th ...
- B. Divisor Subtraction
链接 [http://codeforces.com/contest/1076/problem/B] 题意 给你一个小于1e10的n,进行下面的运算,n==0 结束,否则n-最小质因子,问你进行多少步 ...
- CodeForces-1076B Divisor Subtraction 找规律
题目链接:https://vjudge.net/problem/CodeForces-1076B 题意: 题目要求给定一个数,要求每次减去其最小素因数(既是素数又是其因数),问直到n=0需要做几次运算 ...
- Codeforces Educational Codeforces Round 54 题解
题目链接:https://codeforc.es/contest/1076 A. Minimizing the String 题意:给出一个字符串,最多删掉一个字母,输出操作后字典序最小的字符串. 题 ...
- Educational Codeforces Round 54 (Rated for Div. 2) ABCD
A. Minimizing the String time limit per test 1 second memory limit per test 256 megabytes Descriptio ...
- CoderForces Round54 (A~E)
ProblemA Minimizing the String 题目链接 题解:这一题读完题就写了吧.就是让你删除一个字母,使得剩下的字符组成的字符串的字典序最小:我们只要第一个当前位置的字符比下一个字 ...
- Educational Codeforces Round 54 (Rated for Div. 2) Solution
A - Minimizing the String solved 题意:给出一个字符串,可以移掉最多一个字符,在所有可能性中选取一个字典序最小的. 思路:显然,一定可以移掉一个字符,如果移掉的字符的后 ...
- codeforces1076 A.B.C.D.E
1076A 1076B 1076C 1076D 1076D A. Minimizing the String You are given a string s consisting of n low ...
- Codeforces Edu Round 54 A-E
A. Minimizing the String 很明显,贪心之比较从前往后第一个不一样的字符,所以可以从前往后考虑每一位,如果把它删除,他这一位就变成\(str[i + 1]\),所以只要\(str ...
随机推荐
- 【IDEA】头注释和方法注释
头注释和方法注释 2020-09-08 10:16:17 by冲冲 1.头注释 ①设置 ②模板内容 /** * @ClassName ${NAME} * @Description ${DESCRI ...
- 【Vue.js】SPA
SPA 2019-11-13 23:20:48 by冲冲 1.概念 (1)MPA(multi-page application) 特点:每一次页面跳转的时候,后台服务器都会返回一个新的html文档 ...
- 【Tool】JDK8 安装
JDK8 2019-07-26 14:05:21 by冲冲 1. 下载 通常前往官网 https://www.oracle.com/technetwork/java/javase/download ...
- 【原创】【自制系列】自制stack类型(泛型)
前言 自制类型的第三篇,stack类型.stack是指栈,其实我个人认为stack是最好写的类型,没有之一.关于queue类型需要涉及到循环队列避免浪费内存,但是stack的插入删除都是对于栈顶而言, ...
- ICCV2021 | 渐进采样式Vision Transformer
前言 ViT通过简单地将图像分割成固定长度的tokens,并使用transformer来学习这些tokens之间的关系.tokens化可能会破坏对象结构,将网格分配给背景等不感兴趣的区域,并引 ...
- Codeforces Round #701 (Div. 2) 题解
由于今天实在是太自闭了就前来写场已经 AK 的 div.2 的题解了 这场比赛是我的 div.2 首 AK 哦 A 先特判 \(b=1\),强制将 \(b+1\) 否则容易发现答案最大为 \(\log ...
- Codeforces 1076G - Array Game(博弈论+线段树)
Codeforces 题面传送门 & 洛谷题面传送门 一道 hot tea--听讲解时半懂不懂因为不知道题目意思,最后终究还是琢磨出来了( 首先注意到对于每个 \(a_i\),它具体是什么并不 ...
- android Fragment跳转Fragment
android Fragment跳转Fragment,最新的android studio3 在系统模板建立的BottomNavigationView 中跳转方式 此版本下不能用FragmentMana ...
- du命令之计算文件大小
在linux中,常用du命令来计算文件或目录的大小 名称: du - 计算每个文件的磁盘用量,目录则取总用量. 用法: du [选项]... [文件]... 常用选项 -a, --all 输出所有文件 ...
- day05 django框架之路由层
day05 django框架之路由层 今日内容概要 简易版django请求声明周期流程图(重要) 路由匹配 无名有名分组 反向解析 无名有名解析 路由分发 名称空间 伪静态 虚拟环境 简易版djang ...