题目链接:https://nanti.jisuanke.com/t/30999

样例输入
2
5
8

样例输出
8
14

题意:

squarefree数是指不含有完全平方数( 1 除外)因子的数,

现在一个数字 $n$,可以表示成两个squarefree数 $a,b$ 相乘,即 $n = ab$,

假设 $f\left( n \right)$ 代表了 $n$ 分解成不同的数对 $\left( {a,b} \right)$ 的个数,

现在给你一个 $n$,要求 $f\left( 1 \right) + f\left( 2 \right) + \cdots + f\left( n \right)$。

题解:

不难发现,若 $n$ 含有一个因子是立方数乃至更高次方数,则此时 $f\left( n \right) = 0$,例如 $f\left( {2^3 \times 3} \right) = 0,f\left( {3^4 } \right) = 0$;

则剩下来的数,因子最多就是平方数,不妨举些例子来看每个因子能提供多少贡献:

最开始是 $f\left( 1 \right) = 1$,因为只有 $1 = 1 \times 1$,然后我们给它乘上一些因子……

  1、乘上指数为 $1$ 的因子,例如 $f\left( {1 \times 2} \right)$,加进来的 $2$ ,可以添加在原来$1 \times 1$的乘号左边($2 \times 1$),也可以添加在右边($1 \times 2$),所以贡献了“$\times 2$”,即 $f\left( {1 \times 2} \right) = f\left( 1 \right) \times 2$;

  2、乘上指数为 $2$ 的因子,例如 $f\left( {1 \times 2^2 } \right)$,加进来的 $2^2$,它不能全部添加在某一边,只能拆开来,一半添加在乘号左边,一半添加在乘号右边,即$2 \times 2$,所以贡献了“$\times 1$”,即 $f\left( {1 \times 2^2} \right) = f\left( 1 \right) \times 1$。

那么依次类推,再在后面乘上一些因子,同样的道理,指数为 $1$ 则贡献为“$\times 2$”,指数为 $2$ 则贡献为“$\times 1$”。

很容易的就能得到递推规律:假设 $n$ 的最小素因子是 $p$,则有 $n = m \times p^x$,我们分两种情况讨论:

  1、$x = 1$,$p$ 的贡献为“$\times 2$”,就有 $f\left( n \right) = f\left( m \right) \times 2$;

  2、$x = 2$,$p$ 的贡献为“$\times 1$”,就有 $f\left( n \right) = f\left( m \right)$;

那么,现在的关键就是求得 $1$ 到 $2 \times 10^7$ 的每个数字的最小素因子,线性筛素数的时候可以顺带求出。

AC代码:

#include<bits/stdc++.h>
using namespace std; const int maxn=2e7+;
const int MAX=2e7; int n;
int mpf[maxn]; //存储最小素因子 /************************** 线性筛 - st **************************/
int prime[maxn];
bool isPrime[maxn];
void Screen() //欧拉筛法求素数
{
register int cnt=;
memset(isPrime,,sizeof(isPrime));
isPrime[]=isPrime[]=;
for(int i=;i<=MAX;i++)
{
if(isPrime[i]) prime[cnt++]=i, mpf[i]=i;
for(int j=;j<cnt;j++)
{
if(i*prime[j]>MAX) break;
isPrime[i*prime[j]]=, mpf[i*prime[j]]=prime[j];
if(i%prime[j]==) break;
}
}
}
/************************** 线性筛 - ed **************************/ long long f[maxn]; int main()
{
Screen(); f[]=;
for(int i=;i<=MAX;i++)
{
int mm = mpf[i];
if((long long)mm*mm < MAX && (long long)mm*mm*mm < MAX && i%(mm*mm*mm) == ) f[i]=;
else if((long long)mm*mm < MAX && i%(mm*mm) == ) f[i]=f[i/mm/mm];
else f[i]=*f[i/mm];
}
for(int i=;i<=MAX;i++) f[i]+=f[i-]; int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
printf("%lld\n",f[n]);
}
}

计蒜客 30999 - Sum - [找规律+线性筛][2018ICPC南京网络预赛J题]的更多相关文章

  1. 计蒜客 31001 - Magical Girl Haze - [最短路][2018ICPC南京网络预赛L题]

    题目链接:https://nanti.jisuanke.com/t/31001 题意: 一带权有向图,有 n 个节点编号1~n,m条有向边,现在一人从节点 1 出发,他有最多 k 次机会施展魔法使得某 ...

  2. 计蒜客 30994 - AC Challenge - [状压DP][2018ICPC南京网络预赛E题]

    题目链接:https://nanti.jisuanke.com/t/30994 样例输入: 5 5 6 0 4 5 1 1 3 4 1 2 2 3 1 3 1 2 1 4 样例输出: 55 样例输入: ...

  3. 计蒜客 31451 - Ka Chang - [DFS序+树状数组][2018ICPC沈阳网络预赛J题]

    题目链接:https://nanti.jisuanke.com/t/31451 Given a rooted tree ( the root is node $1$ ) of $N$ nodes. I ...

  4. 计蒜客 30996 - Lpl and Energy-saving Lamps - [线段树][2018ICPC南京网络预赛G题]

    题目链接:https://nanti.jisuanke.com/t/30996 During tea-drinking, princess, amongst other things, asked w ...

  5. 计蒜客 30990 - An Olympian Math Problem - [简单数学题][2018ICPC南京网络预赛A题]

    题目链接:https://nanti.jisuanke.com/t/30990 Alice, a student of grade 6, is thinking about an Olympian M ...

  6. 计蒜客 30999.Sum-筛无平方因数的数 (ACM-ICPC 2018 南京赛区网络预赛 J)

    J. Sum 26.87% 1000ms 512000K   A square-free integer is an integer which is indivisible by any squar ...

  7. ACM-ICPC 2018 南京赛区网络预赛 J题Sum(线性筛素数)

    题目链接:https://nanti.jisuanke.com/t/30999 参考自博客:https://kuangbin.github.io/2018/09/01/2018-ACM-ICPC-Na ...

  8. 【找规律】计蒜客17118 2017 ACM-ICPC 亚洲区(西安赛区)网络赛 E. Maximum Flow

    题意:一张有n个点的图,结点被编号为0~n-1,i往所有编号比它大的点j连边,权值为i xor j.给你n,问你最大流. 打个表,别忘了把相邻两项的差打出来,你会发现神奇的规律……你会发现每个答案都是 ...

  9. 【推导】计蒜客17116 2017 ACM-ICPC 亚洲区(西安赛区)网络赛 C. Sum

    题意:S(x)被定义为x的十进制表示下的数位之和.给你x,让你找一个正整数k,使得S(kx)能被233整除.k不超过2千位. 由于x不超过1000000,不论x是多少,10000000重复233次一定 ...

随机推荐

  1. ajax简单手写了一个猜拳游戏

    使用ajax简单写一个猜拳游戏 HTML代码 <!DOCTYPE HTML> <html lang="en-US"> <head> <me ...

  2. iOS 将Excel导入到SQLite3的过程

    1.打开Excel表格,另存为.csv文件 2.打开SQLite3,选择File -> Import -> other... 3.在弹出的文件选择框中选择步骤1保存的.cvs文件 4在弹出 ...

  3. 彻底删除weblogic域方法

    1.删除 D:\Oracle\Middleware\wlserver_10.3\common\nodemanager\nodemanager.domains 里的base_domain域内容 #Dom ...

  4. 【Nodejs】npm cnpm 淘宝镜像

    一.通过命令配置 1. 命令 npm config set registry https://registry.npm.taobao.org 2. 验证命令 npm config get regist ...

  5. unity3d抛物线的脚本

    using UnityEngine; using System.Collections; public class ProjectileTest : MonoBehaviour { public Ga ...

  6. Fragment切换问题

    片断一: add hind @Overridepublic void onCheckedChanged(RadioGroup group, int checkedId) { switch (check ...

  7. javascript的初步认识

    把握自己,就是时时拥有一颗清澈的心,拥有一片明朗的情怀.嘿嘿,我们在2014-2015的跨度里,我们休息了的四天,今天又回到了学习的阶段,敲起来键盘突然有点陌生,想一想时间真的好快,在这里我们已经是跨 ...

  8. 执行automake时报错 error while making link: Operation not supported

    执行automake时报错: [root@localhost project]# automake --add-missingconfigure.in: installing `./install-s ...

  9. hive异常:创建MySQL时Specified key was too long; max key length is 1000 bytes

    2015-11-13 14:44:44,681 ERROR [main]: DataNucleus.Datastore (Log4JLogger.java:error(115)) - An excep ...

  10. 【正则表达式1】C++11正则表达式

    https://www.cnblogs.com/pukaifei/p/5546968.html [正则表达式1]C++11正则表达式   头文件 #include <regex> rege ...