基础数论练习1——持续更新

(1)f(n)
这题是素数筛的基础上的找规律的题。
规律:
G c d ( n ) = { p n = p x 1 n = p 1 x 1 ∗ p 2 x 2 . . . p k x k Gcd(n)=\begin{cases} p & n = p^{x} \\ 1 & n=p_{1}^{x_{1}}*p_{2}^{x_{2}}...p_{k}^{x_{k}} \end{cases} Gcd(n)={p1n=pxn=p1x1p2x2...pkxk(其中p及其p下标元素都是素数)

简单描述规律的逻辑证明:
我们要明确一点 C n k = n ∗ ( n − 1 ) . . . ( n − k + 1 ) 1 ∗ 2... k = n ∗ n − 1 2 . . . n − k + 1 k C_n^k=\frac{n*(n-1)...(n-k+1)}{1*2...k}=n*\frac{n-1}{2}...\frac{n-k+1}{k} Cnk=12...kn(n1)...(nk+1)=n2n1...knk+1
而且 C n n = 1 C_n^n=1 Cnn=1,每一项分母都有分子和它结合成1
而在Gcd(n)中,最后一项为 C n n − 1 C_n^{n-1} Cnn1,意味着n是不可能被完全消除到1,理论上只有最小为n的数能将n变成1
1)当 n = p x n = p^{x} n=px,时很容易根据上面的分析知道,n始终都会在 C n i C_n^{i} Cni中以 p j 的 形 式 存 在 p^{j}的形式存在 pj,最多被分解到只有p,那么很显然Gcd(n)=p。
2)当 n = p 1 x 1 ∗ p 2 x 2 . . . p k x k n=p_{1}^{x_{1}}*p_{2}^{x_{2}}...p_{k}^{x_{k}} n=p1x1p2x2...pkxk时,按照上面的逻辑必定有i使得 C n i C_n^{i} Cni没有 p j 项 p_{j}项 pj,故任何有关质因数都无法对Gcd做贡献,Gcd的值就为1.

这里使用埃筛,埃筛的利用数因子重复筛数,所以可以。

#include<iostream>
using namespace std;
typedef long long ll;
const int maxn = 1000000+5;
int factor[maxn] = {0},N;
ll ans[maxn];
void e(){
    for(int i = 2;i <= 1000000;i++){
        if(factor[i]==0){
            factor[i] = i;
            for(int j = i*2;j <= 1000000;j+=i){
                if(factor[j]==0)factor[j] = i;
                else factor[j] = 1;
            }
        }
    }
}
void init(){
    ans[2] = 0;
    for(int i = 3;i <= 1000000;i++)ans[i] =ans[i-1] + factor[i];
}
int main(){
    e();
    init();
    while(cin >> N){
        cout << ans[N] <<endl;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值