【FJWC2018】最大真因数
题面
Description
一个合数的真因数是指这个数不包括其本身的所有因数,
例如 6 的正因数有1, 2, 3, 6,其中真因数有 1, 2, 3。
一个合数的最大真因数则是这个数的所有真因数中最大的一个,例如 6 的最大真因数为 3。
给定正整数 l 和 r,请你求出 l 和 r 之间(包括 l 和 r)所有合数的最大真因数之和。
Input
输入共一行,包含两个正整数 l 和 r。保证 l ≤ r。
Output
输出共一行,包含一个整数,表示 [l,r] 内所有合数的最大真因数之和。
Sample Input
1 10
Sample Output
17
【样例 1 解释】
在 1 至 10 之间的合数有 4, 6, 8, 9, 10,
它们的最大真因数分别为 2, 3, 4, 3, 5,
因此最大真因数之和为 2 + 3 + 4 + 3 + 5 = 17。
Hint
【样例 2 输入】
101 1000
【样例 2 输出】
163446
【样例 3 输入】
180208 975313
【样例 3 输出】
151642139152
【样例 4 输入】
339762200 340762189
【样例 4 输出】
112318862921546
【样例 5 输入】
2500000000 5000000000
【样例 5 输出】
3094668961678105770
题目分析
要求合数的最大真因数,相当于求合数除以其最小质因子。
再Min_25筛求素数和的过程中:
\begin{cases}
g(n,j-1)&P_j^2> n\\
g(n,j-1)-f(P_j)\cdot[g(\frac{n}{P_j},j-1)-\sum_{i=1}^{j-1}f(P_i)]&P_j^2\leq n
\end{cases}
\]
其中
\]
求得的便是最小质因子为\(P_j\)的合数之和。
我们只需在处理\(g\)的时候统计答案即可。
代码实现
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdio>
#include<iomanip>
#include<cstdlib>
#define MAXN 0x7fffffff
typedef unsigned long long LL;
const int N=250005;
using namespace std;
inline LL Getint(){register LL x=0,g=1;register char ch=getchar();while(!isdigit(ch)){if(ch=='-')g=-1;ch=getchar();}while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}return x*g;}
int prime[N],tot;bool vis[N];
LL sqr,w[N],g[N],sp[N];
int id1[N],id2[N],m;
void Pre(int n){
for(int i=2;i<=n;i++){
if(!vis[i])prime[++tot]=i,sp[tot]=sp[tot-1]+i;
for(int j=1;j<=tot&&1ll*i*prime[j]<=n;j++){
vis[i*prime[j]]=1;
if(i%prime[j]==0)break;
}
}
}
LL Solve(LL n){
tot=m=0;
sqr=sqrt(n),Pre(sqr);
for(LL i=1,j;i<=n;i=j+1){
j=n/(n/i),w[++m]=n/i;
g[m]=w[m]*(w[m]+1)/2-1;
if(w[m]<=sqr)id1[w[m]]=m;else id2[j]=m;
}
LL ans=0;
for(int j=1;j<=tot;j++){
for(int i=1;i<=m&&(LL)prime[j]*prime[j]<=w[i];i++){
int k=(w[i]/prime[j]<=sqr)?id1[w[i]/prime[j]]:id2[n/(w[i]/prime[j])];
if(i==1)ans+=g[k]-sp[j-1];
g[i]-=prime[j]*(g[k]-sp[j-1]);
}
}
return ans;
}
int main(){
LL l=Getint(),r=Getint();
cout<<Solve(r)-Solve(l-1);
return 0;
}
【FJWC2018】最大真因数的更多相关文章
- BZOJ-5244 最大真因数(min25筛)
题意:一个数的真因数指不包括其本身的所有因数,给定L,R,求这个区间的所有数的最大真因数之和. 思路:min25筛可以求出所有最小因子为p的数的个数,有可以求出最小因子为p的所有数之和. 那么此题就是 ...
- Project Euler 95:Amicable chains 亲和数链
Amicable chains The proper divisors of a number are all the divisors excluding the number itself. Fo ...
- Python 计算当真因子个数为偶数个时为幸运数,计算区间内幸运数之和
晚饭后朋友发来个问题,正好无事做,动手写了一下 若一个正整数有偶数个不同的真因子,则称该数为幸运数.如4含有2个真因子为 1 和 2 .故4是幸运数.求[2,100]之间的全部幸运数之和. 常规思路 ...
- POJ3292&&2115
这两道题还是比较简单的,没有什么难度 不过归在数论这个专题里我还是比较认同的,多少有些关系 3292 题目大意:给你一个范围n,让你求出这个范围内所有形式类似\(4k+1(k为正整数)\)的数中的H- ...
- 【FCS NOI2018】福建省冬摸鱼笔记 day1
省冬的第一天. 带了本子,笔,一本<算法导论>就去了.惊讶于为什么同学不带本子记笔记. 他们说:“都学过了.”,果然这才是巨神吧. 第一天:数论,讲师:zzx 前几页的课件挺水,瞎记了点笔 ...
- c经典算法
1. 河内之塔 说明 河内之塔(Towers of Hanoi)是法国人M.Claus(Lucas)于1883年从泰国带至法国的,河内为越战时 北越的首都,即现在的胡志明市:1883年法国数学家 Ed ...
- 相亲数--Python
想亲数:在遥远的古代,人们发现某些自然数之间有特殊的关系:如果两个数a和b,a的所有除本身以外的因数之和等于b,b的所有除本身以外的因数之和等于a,则称a,b是一对相亲数 code: def sumF ...
- Java经典算法大全
1.河内之塔.. 2.Algorithm Gossip: 费式数列. 3. 巴斯卡三角形 4.Algorithm Gossip: 三色棋 5.Algorithm Gossip: 老鼠走迷官(一) 6. ...
- 求n的因子个数与其因子数之和
方法一:朴素算法:O(n). #include<bits/stdc++.h> using namespace std; int get_num(int n){ ; ;i<=n;++i ...
随机推荐
- cordova-plugin-alipay-v2使用篇(更新至20170725)(亲测可用)
cordova-plugin-alipay-v2使用篇(更新至20170725)(亲测可用) alipaySdk已更新至20170725版本 支付宝WS_APP_PAY_SDK_BASE_2.0 &l ...
- Android Service完全解析(上)
转载:http://blog.csdn.net/guolin_blog/article/details/11952435 相信大多数朋友对Service这个名词都不会陌生,没错,一个老练的Androi ...
- JavaWeb开发之二《JSP + Tomcat的第一个程序“Hello World”》
搬以前写的博客[2014-12-10 22:41] 前一篇博客讲了Tomcat环境搭建,于是开始第一个“Hello JSP”程序. 服务器环境搭建好之后,我们开始写自己的网站,这里简单的写一个没有后台 ...
- Qt:代码里存在中文时带来的问题
一.报错: 常量中有换行符 方法1: 把文本文件转化为unicode或者utf-8, 同是还要带上QString::fromLocal8Bit() 还有其他方法,感觉不靠谱 二.显示异常:乱码 QSt ...
- Redux DevTools Extension 的使用
网址 https://github.com/zalmoxisus/redux-devtools-extension 1.const composeEnhancers = window.__REDUX ...
- 理解First-Class Functions
def logger(msg): def log_message(): print('Log:', msg) return log_message # 返回的是函数 log_hi = logger(' ...
- synchronized(this) 与 synchronized(class) 理解
1.概念 synchronized 是 Java 中的关键字,是利用锁的机制来实现同步的. 锁机制有如下两种特性: 互斥性:即在同一时间只允许一个线程持有某个对象锁,通过这种特性来实现多线程中的协调机 ...
- Vue学习笔记【13】——键盘修饰符以及自定义键盘修饰符
1.x版本中自定义键盘修饰符[了解] Vue.directive('on').keyCodes.f2 = 113; 2.x版本中自定义键盘修饰符 通过Vue.config.keyCodes.名称 = ...
- PHP ftp_exec() 函数
定义和用法 ftp_exec() 函数请求在 FTP 服务器上执行一个程序或命令. 如果成功,该函数返回 TRUE.如果失败,则返回 FALSE. 语法 ftp_exec(ftp_connection ...
- delphi 文件夹操作(监控)
delphi 监控文件系统 delphi 监控文件系统 你是否想为你的Windows加上一双眼睛,察看使用者在机器上所做的各种操作(例如建立.删除文件:改变文件或目录名字)呢? 这里介绍一种利用Win ...