码迷,mamicode.com
首页 > 其他好文 > 详细

线性素数筛 ACM-ICPC 2018 南京赛区网络预赛 J Sum

时间:2018-09-01 23:48:33      阅读:190      评论:0      收藏:0      [点我收藏+]

标签:++i   cst   memset   for   string   amp   man   define   space   

https://www.jisuanke.com/contest/1555?view=challenges

题意:

题解:写完都没发现是个积性函数233

想法就是对x分解质因数,f(x)就是2^k,其中k是x分解结果中次数为一的质因子个数。如果有某个次数大于等于3,f(x)==0;

这样明显会TLE

所以就想一个递推的方法。

于是魔改了一下线性筛。

#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<ctime>
#include<cmath>
#include<algorithm>
#include<iomanip>
#include<queue>
#include<map>
#include<bitset>
#include<stack>
#include<vector>
#include<set>
using namespace std;
#define MAXN 1010
#define MAXM 1010
#define INF 1000000000
#define MOD 1000000007
#define ll long long
#define eps 5e-6
ll n, N;
#define rep(i,t,n)  for(int i =(t);i<=(n);++i)
#define per(i,n,t)  for(int i =(n);i>=(t);--i)
#define mmm(a,b) memset(a,b,sizeof(a))
const int maxn=2e7+1e5;



int num = 0;
int vis[maxn], pri[maxn];
ll f[maxn];
ll s[maxn];
void init() {
    rep(i, 1, maxn)f[i] = 1;
    mmm(vis, 0);
    mmm(pri, 0);
    num = 0;
}
void getpri() {
    for ( ll i = 2; i<N; i++) {
        if (!vis[i])pri[++num] = i,f[i]=2;
        for ( ll j = 1; j <= num && pri[j] * i<N; j++) {
            vis[pri[j] * i] = 1;
            f[pri[j] * i] *= f[pri[j]]*f[i];
            if (i%pri[j] == 0) { //二次方
                f[pri[j] * i] /= 4;
                if (i%(pri[j] * pri[j]) == 0)f[pri[j] * i] = 0;//三次方以上
                break;
            }//如果i遇到了自己最小的质因子就直接跳出
        }
    }
}
int main() {
    int t;
    cin >> t;
    int x = maxn;
    N = maxn;
    init();
    getpri();
    s[1] = 1;
    rep(i, 2, x) {
        s[i] =s[i-1]+ f[i];
    }
    while (t--)
    {
        cin >> n;
        cout << s[n]<< endl;
    }
    //cin >> t;
    return 0;
}
/*
1
8
20000000
2
5
8


*/

 

线性素数筛 ACM-ICPC 2018 南京赛区网络预赛 J Sum

标签:++i   cst   memset   for   string   amp   man   define   space   

原文地址:https://www.cnblogs.com/SuuT/p/9571597.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!