SUM

  题意:f(n)是n可以拆成多少组n=a*b,a和b都是不包含平方因子的方案数目,对于a!=b,n=a*b和n=b*a算两种方案,求i=1nf(i)

  首先我们可以知道,n=1时f(1)=1,

  然后我们继续分析,当n为素数p时,只能拆成n=1*p和n=p*1这两种,所以f(p)=2,

  而当n=两个质数的乘积时,对于n=左*右,p1跟p2可以任意分配在左和右,它们的方案是类乘的,所以f(p1*p2)=f(p1)*f(p2)

  这里可以看出f(n)是个积性函数,那说明我们可以把它通过线性筛筛出来。

  那我们就要考虑n=pk的时候,当k>2时,对于n=左*右,不管哪个方案,左或者右那边必定有一边是存在因子包含p2的,所以此时f(pk)=0,k>2

  k=1时便是n=p,而k==2时呢,p只能分别在左右两边各一个,f(p2)=1

  最后推广n=p1k1*p2k2的时候,k1,k2肯定都不能>2,然后就是(0,0),(0,1),(0,2),(1,0),(1,1,)(1,2),(2,0)(2,1)(2,2)这九种,推导一下就是f(p1k1*p2k2)=f(p1k1)*f(p2k2)

  具体编程实现上的话,因为欧拉筛对于每个数来说,是通过它的最小质因子来筛掉它,那么我们可以记录每个数的最小质因子的指数exp,详情见注释

 1 #include<cstdio>
 2 typedef long long ll;
 3 const int N=20000007;
 4 bool nop[N]={false};
 5 int pn,pri[N/10],exp[N],f[N];
 6 void init()
 7 {
 8     f[1]=1;
 9     for(int i=2;i<N;i++)
10     {
11         if(!nop[i])
12         {
13             f[i]=2;
14             exp[i]=1;
15             pri[pn++]=i;
16         }
17         for(int j=0;j<pn&&1ll*i*pri[j]<N;j++)
18         {
19             int pp=i*pri[j];
20             nop[pp]=true;
21             //欧拉筛中,pri[j]是pp的最小质因子
22             if(i%pri[j]==0)
23             {
24                 //i的质因子有pri[j],pp的最小质因子的指数就是exp[i]+1
25                 exp[pp]=exp[i]+1;
26                 if(exp[pp]>2)
27                     f[pp]=0;
28                 else
29                     f[pp]=f[i/pri[j]];
30                 //在i的方案上,再加入一个pri[j],不能跟i中原来有的
31                 //pri[j]在同一边,而在对立边时,i中原来有的pri[j]
32                 //在左,在右都一样,对方案没有了影响,所以
33                 //f[i*pri[j]]=f[i/pri[j]];
34                 break;
35             }
36             //i的质因子没有pri[j],那么pp中只有一个pri[j]
37             exp[pp]=1;
38             f[pp]=f[i]*f[pri[j]];
39         }
40     }
41     for(int i=1;i<N;i++)
42         f[i]+=f[i-1];
43 }
44 int main()
45 {
46     init();
47     int t,n;
48     scanf("%d",&t);
49     while(t--)
50     {
51         scanf("%d",&n);
52         printf("%d\n",f[n]);
53     }
54     return 0;
55 } 

线性啊欧拉啊

  对于f[pp]=f[i/pri[j]]处,我说得不是很清楚,也不知道怎么表达那个意思,可以自行模拟体会一下。

转载于:https://www.cnblogs.com/LMCC1108/p/11100571.html

ACM-ICPC 2018 南京赛区网络预赛Sum,线性筛处理积性函数相关推荐

  1. ACM-ICPC 2018 南京赛区网络预赛

    轻轻松松也能拿到区域赛名额,CCPC真的好难 An Olympian Math Problem 问答 只看题面 54.76% 1000ms 65536K Alice, a student of gra ...

  2. ACM-ICPC 2018 南京赛区网络预赛 Lpl and Energy-saving Lamps 线段树

    目录 ACM-ICPC 2018 南京赛区网络预赛 Lpl and Energy-saving Lamps 线段树 题面 题意 思路 ACM-ICPC 2018 南京赛区网络预赛 Lpl and En ...

  3. ACM-ICPC 2018 南京赛区网络预赛 E AC Challenge(状压dp)

    Dlsj is competing in a contest with n (0 < n \le 20)n(0<n≤20) problems. And he knows the answe ...

  4. ACM-ICPC 2018 南京赛区网络预赛 B. The writing on the wall

    题目链接:https://nanti.jisuanke.com/t/30991 2000ms 262144K Feeling hungry, a cute hamster decides to ord ...

  5. ACM-ICPC 2018 南京赛区网络预赛 AC Challenge

    Dlsj is competing in a contest with n (0 < n \le 20)n(0<n≤20) problems. And he knows the answe ...

  6. ACM-ICPC 2018 南京赛区网络预赛 - AC Challenge(状压DP)

    ACM-ICPC 2018 南京赛区网络预赛 - AC Challenge 题意: 有n个题目,每个题目有一些信息,,第 t 个过第 i 题会得到分数 t*ai + bi 在过第 i 题前必须要先过  ...

  7. E. AC Challenge ACM-ICPC 2018 南京赛区网络预赛 状压dp + 枚举状态

    博客目录 原题 题目链接 Dlsj is competing in a contest with n (0 < n \le 20)n(0<n≤20) problems. And he kn ...

  8. ACM-ICPC 2018 南京赛区网络预赛 J Sum(欧拉线性筛+思维)

    Sum 问题分析 题意:我们将类似于6=2⋅36=2⋅36 = 2\cdot 3这样的数称为asquare−freeintegerasquare−freeintegera\:square-free\: ...

  9. 【ACM-ICPC 2018 南京赛区网络预赛】 J. Sum 【算术基本定理 + 离线分段打表】

    分析:首先我们要用算术基本来找出求f(x)的规律,找到之后,我们只要求出前缀和就行了,这里可以用离线分段打表巧求,QAQ. 代码 #include <map> #include <s ...

最新文章

  1. Linear Regression(一)——
  2. 生物信息行业应该具备哪些基础素养?重点应该放在计算机方面还是生物方面或者说其他?
  3. openstack登陆dashboard提示认证发生错误
  4. 《高效程序员的45个习惯》-之一
  5. Ext JS 5 beta版发布
  6. 多线程百度网盘爬虫Python完整源码
  7. SpringBoot配置图片虚拟映射
  8. 二维随机变量期望公式_概率论笔记-Ch4期望与方差
  9. linux行位换行符,换行符或标点符号作为elasticsearch中的位置间隔
  10. 经典的CSS代码(转)
  11. 备考系统集成项目管理工程师,其实很简单!(干货)
  12. C/C++ typedef用法详解
  13. 数字图像处理_05_(图像锐化与边缘检测——Premittt算子、Roberts算子、Sobel算子、Scharr算子、Laplacian算子、LoG算子、Canny算子)
  14. PHP本地文件包含漏洞环境搭建与利用
  15. python 股票竞价数据_百度竞价的数据分析怎么做
  16. 对promise、resolve和reject的简单理解
  17. L3HSEC 2022秋季招新赛部分WP
  18. c++ stl源码-我理解的空间配置器
  19. 【前端面试必读】实现图片16:9
  20. iPhone 移除描述文件详细步骤(Apple Configurator 2)

热门文章

  1. 3DShader之投影贴图(Projective Texturing)
  2. python二进制文件解析_python – 解析二进制文件的正则表达式?
  3. Docker组队学习(一)
  4. python与Spark结合,PySpark的机器学习环境搭建和模型开发
  5. 3090显卡安装pytorch出错
  6. class中函数的this指向
  7. [转载]Qt之解决中文乱码_vortex_新浪博客
  8. mysql表文件创建_php文件创建mysql的表
  9. listview mysql 安卓_Android——ListView与数据库的结合
  10. 前牙正常覆盖是多少_深覆合和深覆盖两者怎么区分?花两分钟进来了解一下