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. 安装maven配置maven环境变量

    在官网下载maven的包 我们下载的是:apache-maven-3.5.2-bin.zip 3.解压缩maven的包到某个目录中 4.配置maven的环境变量 配置M2_HOME环境变量为maven ...

  2. mabatis的sql标签

    定义:mapper.xml映射文件中定义了操作数据库的sql,并且提供了各种标签方法实现动态拼接sql.每个sql是一个statement,映射文件是mybatis的核心. 一,内容标签 1.Name ...

  3. python的异常打印

    在代码运行中有的代码可能会发生异常,但是奇怪的是异常信息并没有打印出来, 于是我们在代码中加入这个就能打印出来啦. try: #playsound(msg.file_name()) #playsoun ...

  4. 『与善仁』Appium基础 — 15、使用Appium的第一个Demo

    我们使用Python语言作为测试脚本的编写语言. 执行脚本前提: Android模拟器或者手机是开机状态. 使用确保电脑和Android设备进行了链接. 也就是使用ADB命令adb connect链接 ...

  5. 8.1 k8s使用PV/PVC做数据持久化运行redis服务,数据保存至NFS

    1.制作redis docker镜像 1.1 准备alpine基础镜像 # 下载 docker pull alpine:3.13 # 更改tag docker tag alpine:3.13 192. ...

  6. FJOI2020 的两道组合计数题

    最近细品了 FJOI2020 的两道计数题,感觉抛开数据范围不清还卡常不谈里面的组合计数技巧还是挺不错的.由于这两道题都基于卡特兰数的拓展,所以我们把它们一并研究掉. 首先是 D1T3 ,先给出简要题 ...

  7. 洛谷 P5331 - [SNOI2019]通信(CDQ 分治优化建图+费用流)

    题面传送门 首先熟悉网络流的同学应该能一眼看出此题的建模方法: 将每个点拆成两个点 \(in_i,out_i\),连一条 \(S\to in_i\),容量为 \(1\) 费用为 \(0\) 的边 连一 ...

  8. 【机器学习与R语言】9- 支持向量机

    目录 1.理解支持向量机(SVM) 1)SVM特点 2)用超平面分类 3)对非线性空间使用核函数 2. 支持向量机应用示例 1)收集数据 2)探索和准备数据 3)训练数据 4)评估模型 5)提高性能 ...

  9. Python Cheatsheet

    Comprehensive Python Cheatsheet Download text file, Buy PDF, Fork me on GitHub or Check out FAQ. Con ...

  10. 毕业设计之ansible_quan_bbs设置

    ansible创建连接: 客户端(管理节点) 可能需要安装包: yum install -y libselinux-python 实现ssh免密码登陆管理的服务器 [apps@anza ~]$ sud ...