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 ...
随机推荐
- 解决mac电脑耳机/外放突然无声音
问题现象 mac电脑基本不会关机,近期发送隔一段时间出现网易云音乐可以播放但是耳机.外放均无声音的问题.此时,电脑本身的声音提示.远程会议声音均正常. 解决方法 网上搜了一圈解决方案,最后发现是输出设 ...
- [R] venn.diagram保存pdf格式文件?
vennDiagram包中的主函数绘图时,好像不直接支持PDF格式文件: dat = list(a = group_out[[1]][,1],b = group_out[[2]][,1]) names ...
- Linux-root管理员创建新用户
Linux 系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统.用户的账号一方面可以帮助系统管理员对使用系统的用户进行 ...
- Linux 软件安装位置选择指南
Linux 软件安装 Linux 下安装软件不像 Windows 下安装这么简单,Windows 下会自动选择合适安装路径,而 Linux 下安装路径大部分完全由自己决定,我可以将软件安装到任意可 ...
- C/C++ Qt 数据库与TreeView组件绑定
在上一篇博文<C/C++ Qt 数据库QSql增删改查组件应用>介绍了Qt中如何使用SQL操作函数,并实现了对数据库的增删改查等基本功能,从本篇开始将实现数据库与View组件的绑定,通过数 ...
- Shell 管道指令pipe
目录 管道命令pipe 选取命令 cut.grep cut 取出需要的信息 grep 取出需要行.过滤不需要的行 排序命令 sort.wc.uniq sort 排序 假设三位数,按十位数从小到大,个位 ...
- idea安装插件 JClassLib Bytecode viewer
目录 idea安装插件 JClassLib Bytecode viewer 安装过程 使用 idea安装插件 JClassLib Bytecode viewer IDEA 中安装 jClassLib ...
- accurate, accuse
accurate accurate(不是acute)和precise是近义词,precise里有个pre,又和excise(切除, 不是exercise),concise一样有cise.Why? 准确 ...
- 内存管理——array new,array delete
1.array new array new就是申请一个数组空间,所以在delete的时候一定不能忘记在delete前加[] delete加上[]符号以后,就相当于告诉系统"我这里是数组对象, ...
- IDEA 超实用使用技巧分享
前言 工欲善其事 必先利其器 最近受部门的邀请,给入职新人统一培训IDEA,发现有很多新人虽然日常开发使用的是IDEA,但是还是很多好用的技巧没有用到,只是用到一些基本的功能,蛮浪费IDEA这个优 ...