• 【ACM-ICPC 2018 南京赛区网络预赛 J】Sum


    【链接】 我是链接,点我呀:)
    【题意】

    在这里输入题意

    【题解】

    线性筛求出每个数的最小质因子x for 从1-n 对于i,它的最小质因子为x 考虑i=a*b 如果i能被x^3整除 那么这x怎么分配给它的两个因子a,b都不行,(都有一个因子会分配至少2个以上,那么我们提出来一个x^2的话,a或b就能被x^2整除了)。所以ans[i] = 0 如果i能被x^2整除(先判断x^3再判断x^2这样能保证x就只能被x^2整除),那么ans[i] = ans[i/(x^2)] 因为这个x显然只能分到两边去(a,b各分配一个,不能都分配到a或都分配到b) 所以答案和i/(x^2)的一样.i/(x^2)有多少个答按a'*b',那么把a'和b'都各乘上x就ok 如果i只能被x整除 ans[i] = ans[i/x]*2 因为这个x有两种可能,分到a或者b。 所以i/x的每种方案a',b'。 加一个x乘在a'或者b'都能凑成i的方案.且乘1个x显然不会让它有平方因子。

    ans[1]=1
    然后按照上面的规则递推就好
    (再求个前缀和

    【代码】

    /*
    	N在const里面,可以改动;
    	求出2..N之间的所有质数;
    	放在zsb数组里面;
    	时间复杂度是O(N)的;
    	但是需要空间也是O(N)的;
    */
    
    #include <bits/stdc++.h>
    using namespace std;
    
    const int N = 2e7;
    bool iszs[N + 10];
    int mizs[N+10];
    int ans[N+10];
    
    vector <int> zsb;
    
    int main() {
        #ifdef LOCAL_DEFINE
    	    freopen("rush_in.txt", "r", stdin);
    	#endif
    	memset(iszs, true, sizeof iszs);
    	for (int i = 2; i <= N; i++) {
    		if (iszs[i]) zsb.push_back(i);
    		int len = zsb.size();
    		for (int j = 0; j <= len - 1; j++) {
    			int t = zsb[j];
    			if (i*t > N) break;
    			iszs[i*t] = false;
    			mizs[i*t] = t;
    			if (i%t == 0) break;
    		}
    	}
        ans[1] = 1;
        for (int i = 2;i <= N;i++){
            int t = mizs[i];
            if (t<=1000 && (i%(t*t*t)==0)){
                ans[i] = 0;
            }else if (t<=10000&&(i%(t*t)==0)){
                ans[i] = ans[i/(t*t)];
            }else {
                ans[i] = ans[i/t]*2;
            }
        }
    
        for (int i = 2;i <= N;i++) ans[i] +=ans[i-1];
        int T;
        scanf("%d",&T);
        while (T--){
            int n;
            scanf("%d",&n);
            printf("%d
    ",ans[n]);
        }
    	return 0;
    }
    
    
  • 相关阅读:
    IDEA生成可执行的jar文件
    Android ROM包定制(解包,增删模块,打包)
    frida的用法--Hook Java代码篇
    C语言sprintf和sscanf函数用法
    C语言memcpy函数的用法
    自己动手编译Android(LineageOS)源码
    j2ee高级开发技术课程第三周
    linux内核学习之全局描述符表(GDT)(二)
    螺旋队列顺时针方向 和逆时针方向的实现
    zigzag数组:输入n,求一个nXn矩阵,规定矩阵沿45度递增,形成一个zigzag数组
  • 原文地址:https://www.cnblogs.com/AWCXV/p/9591958.html
Copyright © 2020-2023  润新知