keep on coding 8.26-3

3.
【问题描述】
数学题。 函数求值:  【输入格式】第一行一个整数 T,表示有 T 个询问。接下来 T 行,每行第一个数 n 【输出格式】 T 行,每行表示第 i 个询问中 F(n)的值 【样例输入 1 5 1 2 3 4 5 【样例输出 11 3 7 11 21  解决本题基于三个定理: ①当a为质数时 f(a)=a*(a-1)+1; ②当a为质数时 f(a^2)=f(a)*a*a-a+1,更高次方推理类似 ③当gcd(a,b)==1时 f(a*b)=f(a)*f(b) 
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define For(i,j,k) for(int i=j;i<=(k);i++)
using namespace std;
const int maxn=10001000;
typedef long long LL;
int zhishu[maxn];
int s[maxn];
LL f[maxn];
void getzhishu(){
	For(i,2,maxn-1) zhishu[i]=1;
	For(i,2,maxn-1){
		if(zhishu[i]){
			for(int j=i<<1;j<maxn;j+=i) zhishu[j]=0;
		}
	}
}
void solve(){
	for(LL i=1;i<maxn;i++) f[i]=1LL;
	for(LL i=2;i<maxn-1000;i++){
		if(zhishu[i]){
			s[i]=i;
			f[i]=(LL)(i-1)*i+1;
			for(LL j=i,k=j*i;j<maxn && k<maxn;j=k,k=j*i){
				f[k]=(f[j]*i*i)-i+1;
				s[k]=i;
			}
		}
		if(s[i]){
			for(LL j=2;j*i<maxn;j++){
				if(j%s[i]){
					f[j*i]=f[i]*f[j];
				}
			}
		}
	}
}
int main(){
	getzhishu();
	solve();
	LL T,n;
	scanf("%lld",&T);
	while(T--){
		scanf("%lld",&n);
		printf("%lld\n",f[n]);
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值