ACM-ICPC 2018 南京赛区网络预赛 题解(未完)

版权声明:转载请声明出处!!!https://blog.csdn.net/anthony1314 https://blog.csdn.net/anthony1314/article/details/82290560

目录

 

A.An Olympian Math Problem【签到题】

J.Sum【分解质因数+线性筛】


A.An Olympian Math Problem【签到题】

传送门

题意:

给你一个n

求S模n的值

题解:推规律

AC_code:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int main() {
	int t;
	scanf("%d", &t);
	while(t--) {
		ll n;
		cin>>n;
		cout<<n-1<<endl;
	}
	return 0;
}

J.Sum【分解质因数+线性筛】

传送门

题意:给你一个数n

f(n)为     定义a*b = n 且 a和b不为某个数的平方数的倍数   的对数         且a*b=n 与 b*a=n为两对

求  f(1).....f (n)的和

题解:

唯一分解 x

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

如果每个数都去枚举一遍求会tle 所以通过线性筛改一下就不会tle了

AC_code:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 20100000;
typedef long long ll;

int num = 0;
int vis[maxn], pri[maxn];
ll f[maxn], s[maxn];

void init() {
	for(int i = 0; i < maxn; i++) {
		f[i] = 1;
	}
	memset(vis, 0, sizeof(vis));
	memset(pri, 0, sizeof(pri));
	num = 0;
}

void getpri() {
	for(int i = 2; i < maxn; i++) {
		if(!vis[i]) {
			pri[++num] = i;
			f[i] = 2;
		}
		for(int j = 1; j <= num && pri[j] * i < maxn; 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;
			}
		}
	}
}

void solve() {
	getpri();
	s[1] = 1;
	for(int i = 2; i < maxn; i++){
		s[i] = s[i-1] + f[i];
	}
	int t;
	cin>>t;
	while(t--) {
		int n;
		cin>>n;
		cout<<s[n]<<endl;
	}
}

int main() {
	init();
	solve();
	return 0;
}

猜你喜欢

转载自blog.csdn.net/anthony1314/article/details/82290560