2018 南京预选赛 J Sum ( 欧拉素数筛 、Square-free Number、DP )
题意 :
定义不能被平方数整除的数为 Square-free Number
定义 F(i) = 有几对不同的 a 和 b 使得 i = a * b 且 a 、b 都是 Square-free
给出一个 N 求

分析 :
首先 Square-free 有一个性质
就是用唯一分解定理将 Square-free Number 分解后
素因数的指数都是 1
那么对于 a、b 是 Square-free Number
相乘 a * b 得出的 i 其不会有素因子的指数超过 2
然后你要熟悉欧拉筛
欧拉筛之所以是线性是因为、它保证筛出来的合数
都是用其最小质因子筛出来的、且做到不重复
定义 dp[i] = 题目所述的 F[i] 初始化 dp[1] = 1
然后在欧拉筛中进行动态规划、分几种情况
if i is prime number dp[i] = 2 ( 分别可以是 a 可以是 b )
if ( i % prime[j] != 0 ) dp[i] = dp[i] * dp[prime[j]] ( i 不是 prime[j] 的倍数、此方程显然 )
if ( i % prime[j] == 0){ (表示 i 至少包含了一个 prime[j] )
if( i % (prime[j]^2) == 0 ) dp[i*prime[j]] = 0 ( i * prime[j] 肯定有素因数指数 > 2 )
else if( i % prime[j] == 0 ) dp[i*prime[j]] = dp[i/prime[j]] ( i * prime[j] 会使得 prime[j] 这个因子指数为 2、所以就少了它的数量 )
}
#include<bits/stdc++.h>
#define LL long long
#define ULL unsigned long long
#define scl(i) scanf("%lld", &i)
#define scll(i, j) scanf("%lld %lld", &i, &j)
#define sclll(i, j, k) scanf("%lld %lld %lld", &i, &j, &k)
#define scllll(i, j, k, l) scanf("%lld %lld %lld %lld", &i, &j, &k, &l)
#define scs(i) scanf("%s", i)
#define sci(i) scanf("%d", &i)
#define scd(i) scanf("%lf", &i)
#define scIl(i) scanf("%I64d", &i)
#define scii(i, j) scanf("%d %d", &i, &j)
#define scdd(i, j) scanf("%lf %lf", &i, &j)
#define scIll(i, j) scanf("%I64d %I64d", &i, &j)
#define sciii(i, j, k) scanf("%d %d %d", &i, &j, &k)
#define scddd(i, j, k) scanf("%lf %lf %lf", &i, &j, &k)
#define scIlll(i, j, k) scanf("%I64d %I64d %I64d", &i, &j, &k)
#define sciiii(i, j, k, l) scanf("%d %d %d %d", &i, &j, &k, &l)
#define scdddd(i, j, k, l) scanf("%lf %lf %lf %lf", &i, &j, &k, &l)
#define scIllll(i, j, k, l) scanf("%I64d %I64d %I64d %I64d", &i, &j, &k, &l)
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
#define lowbit(i) (i & (-i))
#define mem(i, j) memset(i, j, sizeof(i))
#define fir first
#define sec second
#define VI vector<int>
#define ins(i) insert(i)
#define pb(i) push_back(i)
#define pii pair<int, int>
#define VL vector<long long>
#define mk(i, j) make_pair(i, j)
#define all(i) i.begin(), i.end()
#define pll pair<long long, long long>
#define _TIME 0
#define _INPUT 0
#define _OUTPUT 0
clock_t START, END;
void __stTIME();
void __enTIME();
void __IOPUT();
using namespace std;
;
bool isPrime[maxn];
LL Prime[maxn]; ;
LL dp[maxn];
LL ans[maxn];
inline void init()
{
dp[] = ;
ans[] = 1LL;
mem(isPrime, true);
; i<=(maxn-); i++){
if(isPrime[i]){
dp[i] = ;
Prime[tot++] = i;
}
; j<tot && i*Prime[j]<=(maxn-); j++){
isPrime[i*Prime[j]] = false;
){
) dp[i*Prime[j]] = ;
else dp[i*Prime[j]] = dp[i / Prime[j]];
break;
}else dp[i*Prime[j]] = dp[i] * dp[Prime[j]];
}
ans[i] = ans[i-] + (LL)dp[i];
}
}
int main(void){__stTIME();__IOPUT();
init();
int nCase;
sci(nCase);
while(nCase--){
int n;
sci(n);
printf("%lld\n", ans[n]);
}
__enTIME();;}
void __stTIME()
{
#if _TIME
START = clock();
#endif
}
void __enTIME()
{
#if _TIME
END = clock();
cerr<<"execute time = "<<(double)(END-START)/CLOCKS_PER_SEC<<endl;
#endif
}
void __IOPUT()
{
#if _INPUT
freopen("in.txt", "r", stdin);
#endif
#if _OUTPUT
freopen("out.txt", "w", stdout);
#endif
}
2018 南京预选赛 J Sum ( 欧拉素数筛 、Square-free Number、DP )的更多相关文章
- ACM-ICPC 2018 南京赛区网络预赛 J.sum(欧拉筛)
题目来源:https://nanti.jisuanke.com/t/A1956 题意:找一个数拆成无平方因子的组合数,然后求前缀和. 解题思路:我们可以把某个数分解质因数,如果某个数可以分解出三个相同 ...
- HDU - 4548-美素数 (欧拉素数筛+打表)
小明对数的研究比较热爱,一谈到数,脑子里就涌现出好多数的问题,今天,小明想考考你对素数的认识. 问题是这样的:一个十进制数,如果是素数,而且它的各位数字和也是素数,则称之为"美素数&quo ...
- 欧拉函数O(sqrt(n))与欧拉线性筛素数O(n)总结
欧拉函数: 对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目. POJ 2407.Relatives-欧拉函数 代码O(sqrt(n)): ll euler(ll n){ ll ans=n; ...
- [POJ1595]欧拉线性筛(虽然这道题不需要...)
欧拉线性筛. 对于它的复杂度的计算大概思考了很久. procedure build_prime; var i,j:longint; begin fillchar(vis,sizeof(vis),tru ...
- poj2909 欧拉素数筛选
刚刚学了一种新的素数筛选法,效率比原先的要高一些,据说当n趋近于无穷大时这个的时间复杂度趋近O(n).本人水平有限,无法证明. 这是道水题,贴代码出来重点是欧拉筛选法.我把原来普通的筛选法贴出来. / ...
- 【bzoj3944/bzoj4805】Sum/欧拉函数求和 杜教筛
bzoj3944 题目描述 输入 一共T+1行 第1行为数据组数T(T<=10) 第2~T+1行每行一个非负整数N,代表一组询问 输出 一共T行,每行两个用空格分隔的数ans1,ans2 样例输 ...
- Sum(欧拉降幂+快速幂)
Input 2 Output 2 Hint 1. For N = 2, S(1) = S(2) = 1. 2. The input file consists of multiple test cas ...
- HDU - 2824 The Euler function 欧拉函数筛 模板
HDU - 2824 题意: 求[a,b]间的欧拉函数和.这道题卡内存,只能开一个数组. 思路: ϕ(n) = n * (p-1)/p * ... 可利用线性筛法求出所有ϕ(n) . #include ...
- 【BZOJ3944/4805】Sum/欧拉函数求和 杜教筛
[BZOJ3944]Sum Description Input 一共T+1行 第1行为数据组数T(T<=10) 第2~T+1行每行一个非负整数N,代表一组询问 Output 一共T行,每行两个用 ...
随机推荐
- AC自动机练习2:修改串
这道题的话用到了dp,一个比较简单的dp方程 1466: [AC自动机]修改串 poj3691 时间限制: 1 Sec 内存限制: 128 MB提交: 18 解决: 14[提交] [状态] [讨论 ...
- Elasticsearch5.x安装及常见错误的解决方法
Elasticsearch是基于java开发的,机器上必须要先java环境,elasticsearch5.x建议用jdk8的最新版本.下面介绍elasticsearch5.x的安装步骤: 一.安装El ...
- 牛客 40E 珂朵莉的数论题
大意: 给定$x,y$, 求第$x$小的最小素因子为$y$的数, 若答案>1e9输出0. 若$y>=60$, 可以暴力筛出1e9/60以内的答案. 否则容斥+二分算出答案. #includ ...
- 使用python操作zookeeper
kazoo 介绍 zookeeper的开发接口以前主要以java和c为主,随着python项目越来越多的使用zookeeper作为分布式集群实现,python的zookeeper接口也出现了很多,现在 ...
- 《深入实践C++模板编程》之三——模板参数类型详解
非类型模板参数 和 模板型模板参数 整数以及枚举类型:指向对象或者函数的指针:对对象或函数的引用:指向对象成员的指针.统称为非类型模板参数. 模板型模板参数,是指模板参数还可以是一个模板. 1.整 ...
- 清除vs2005、vs2008起始页最近打开项目
有时候vs2005起始最近打开项目过多很想清除掉,但打遍了也没找到清除选项在哪里,今天找到了方法,发上来和大家共享. 方法一手工操作方法:1)删除最近打开的文件运行regedit,打开HKEY_CUR ...
- HDU3085NightmareII题解--双向BFS
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=3085 分析 大意就是一个男孩和一个女孩在网格里,同时还有两个鬼,男孩每轮走三步,女孩每轮走一步,与鬼曼 ...
- QT编译Mysql驱动问题及解决方案
默认情况下,qt 并没有自带mysql的数据库插件,需要自己编译先安装mysql server ,运行setup.exe时选择自定义安装,安装目录设为"D:\mysqldev"不要 ...
- 关于jar冲突的解决方向servlet-api
1.可以考虑尽量往 java自带的jar 靠 比如说jdk-tools 2.如果用springboot项目 让其他jar 排除servlet-api的依赖 <dependency> ...
- ubuntu - 14.04,安装docker(源代码管理工具)
一,安装docker: 1,安装curl:在shell中执行:sudo apt-get install curl 2,shell中执行:curl -sSL https://get.daocloud.i ...