Content

给定一个数 \(n\),执行如下操作:

  1. 如果 \(n=0\) 结束操作。
  2. 找到 \(n\) 的最小质因子 \(d\)。
  3. \(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 题解的更多相关文章

  1. Divisor Subtraction

    Description You are given an integer number nn. The following algorithm is applied to it: if n=0, th ...

  2. B. Divisor Subtraction

    链接 [http://codeforces.com/contest/1076/problem/B] 题意 给你一个小于1e10的n,进行下面的运算,n==0 结束,否则n-最小质因子,问你进行多少步 ...

  3. CodeForces-1076B Divisor Subtraction 找规律

    题目链接:https://vjudge.net/problem/CodeForces-1076B 题意: 题目要求给定一个数,要求每次减去其最小素因数(既是素数又是其因数),问直到n=0需要做几次运算 ...

  4. Codeforces Educational Codeforces Round 54 题解

    题目链接:https://codeforc.es/contest/1076 A. Minimizing the String 题意:给出一个字符串,最多删掉一个字母,输出操作后字典序最小的字符串. 题 ...

  5. 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 ...

  6. CoderForces Round54 (A~E)

    ProblemA Minimizing the String 题目链接 题解:这一题读完题就写了吧.就是让你删除一个字母,使得剩下的字符组成的字符串的字典序最小:我们只要第一个当前位置的字符比下一个字 ...

  7. Educational Codeforces Round 54 (Rated for Div. 2) Solution

    A - Minimizing the String solved 题意:给出一个字符串,可以移掉最多一个字符,在所有可能性中选取一个字典序最小的. 思路:显然,一定可以移掉一个字符,如果移掉的字符的后 ...

  8. 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 ...

  9. Codeforces Edu Round 54 A-E

    A. Minimizing the String 很明显,贪心之比较从前往后第一个不一样的字符,所以可以从前往后考虑每一位,如果把它删除,他这一位就变成\(str[i + 1]\),所以只要\(str ...

随机推荐

  1. Hibernate数据校验简介

    我们在业务中经常会遇到参数校验问题,比如前端参数校验.Kafka消息参数校验等,如果业务逻辑比较复杂,各种实体比较多的时候,我们通过代码对这些数据一一校验,会出现大量的重复代码以及和主要业务无关的逻辑 ...

  2. 深入理解Redis 数据结构—双链表

    在 Redis 数据类型中的列表list,对数据的添加和删除常用的命令有 lpush,rpush,lpop,rpop,其中 l 表示在左侧,r 表示在右侧,可以在左右两侧做添加和删除操作,说明这是一个 ...

  3. Jmeter BlazeMeter实现web录制

      1. BlazeMeter安装和注册 BlazeMeter是一款与Apache JMeter兼容的chrome插件,采用BlazeMeter可以方便的进行流量录制和脚本生成,作为接口测试脚本编写的 ...

  4. 洛谷 P6276 - [USACO20OPEN]Exercise P(组合数学+DP)

    洛谷题面传送门 废了,又不会做/ll orz czx 写的什么神仙题解,根本看不懂(%%%%%%%%% 首先显然一个排列的贡献为其所有置换环的乘积.考虑如何算之. 碰到很多数的 LCM 之积只有两种可 ...

  5. BZOJ 4556 [HEOI2016/TJOI2016]字符串

    BZOJ 4556 [HEOI2016/TJOI2016]字符串 其实题解更多是用后缀数组+数据结构的做法,貌似也不好写. 反正才学了 sam 貌似比较简单的做法. 还是得先二分,然后倍增跳到 $ s ...

  6. python-django 模板的抽象和继承

    {% include %}只需要一句即可,不需要end***

  7. Python基础之字符串类型内置方法

    目录 1. 字符串类型 2. 常用操作及内置方法 3. 其他内置方法 1. 字符串类型 用途:姓名,性别等 定义: name1 = 'zhaojun' name2 = "zhaojun&qu ...

  8. Linux之sed命令常见用法

    1. sed(stream editor),流编辑器 linux中,主要中sed命令实现对文件的增删改替换查 名称 sed - 用于过滤和转换文本的流编辑器 SYNOPSIS sed [选项]... ...

  9. DOM给表格添加新一行和删除整个行的内容

    DOM用appendChild()给表格添加新一行时,要注意,在HTML中没特别设置<thead>,<tbody>时,会自动添加上,所以要选择表格第一个元素在添加tr. // ...

  10. 【STM32】使用SDIO进行SD卡读写,包含文件管理FatFs(三)-SD卡的操作流程

    其他链接 [STM32]使用SDIO进行SD卡读写,包含文件管理FatFs(一)-初步认识SD卡 [STM32]使用SDIO进行SD卡读写,包含文件管理FatFs(二)-了解SD总线,命令的相关介绍 ...