「数学」数论只会gcd

题目链接 : https://www.luogu.org/problemnew/show/T33159

【题目背景】

小 Z 的 NOIP(节选)

模拟只会猜题意 贪心只能过样例

数学上来先打表 D P 一般看规律

图论强行套模板 数论只会 g c d

递归递推伤不起 搜索茫然 T L E

【题目描述】

可怜的蒟蒻小Z只会做gcd的水题。看,他翻开了一道例题:

i = 1 n i k [ g c d ( i , n ) == 1 ] 的值。

可是他被数据规模吓到了。你能帮帮他吗?

【输入格式】

第一行一个整数 T ,代表有 T 组数据。

接下来 T 行,每行两个整数 n , k

【输出格式】

输出共 T 行,每行一个整数,为你的答案,模 10 9 + 7 输出。

【输入样例】

3
44885 1
65408 3
50979 2

【输出样例】

784589800
496682893
156958624

【数据规模】

【题目来源】

首先,本题为三合一(逃

【第一题】 ACM/ICPC Dalian2011 The boss on Mars

题目描述:求 i = 1 n i 4 [ g c d ( i , n ) == 1 ] 的值。对 10 9 + 7 取模输出。

数据规模 n 10 8 ,有多组数据。

题解: 进行质因数分解,得到最多 8 个质因子。然后将前 n 个四次方和减去与 n 不互质的四次方之和。

多减去的问题,应该考虑容斥原理。

含有因子 d 时,计算与 n 不互质的数 d , 2 d , 3 d , , n d × d ,个数为 n d 。提出公因数 d 后,发现是一个四次方和公式,手推即可。

时间复杂度 O ( n + 2 n 的质因子个数                 )


【第二题】 Codeforces 622F The Sum of the k-th Powers

题目描述:求 i = 1 n i k 的值。对 10 9 + 7 取模输出。

数据规模 n 10 9 , k 10 6 ,仅一组数据。

题解易知答案为 k + 1 次多项式。所以我们需要进行朗格拉日插值。

首先算出 i k 的前缀和,共 k + 2 项。可以计算 k + 2 个点 ( x i , y i ) 确定出多项式。

答案为 f ( x ) = i = 1 k + 1 y i l i ( x )

然后就是将前缀和带入,手推公式。

时间复杂度 O ( k ) O ( k log k )

参考http://aequa.me/index.php/2018/02/01/powersum-linear/

当然要写O(k log k)我也卡不掉(逃


【第三题】 洛谷6月月赛「数学」约数个数和

题目描述:求 n 的 (所有约数的)× k 的约数个数和。对 998244353 取模输出。

数据规模 n , k 10 18 ,仅一组数据。

题解:手推公式,发现需要质因数分解,把结果扔进组合数。

组合数可以线性递推,所以质因数分解成了关键。

质因数分解交给 P o l l a r d R h o O ( n 4 )

不会这个?那么 150 分只能拿到 83 分。

算法 P o l l a r d R h o 的讲解

n = p q 。其中 p , q 互质。最坏的情况就是, p , q 都是质数。

随机从 [ 2 , n 1 ] 中选出一些数 a 1 , a 2 , , a ? ,刚好是 p q 的概率很小。但如果是 gcd ( | a i a j | , n ) 呢?

因为 n = p q ,因数 p , q 都很难找到,但是 p , q 的倍数就很多了!

[ 2 , n 1 ] p 的倍数有 p , 2 p , 3 p , , q p ,一共 q 个。 q 的倍数有 q , 2 q , 3 q , , p q ,一共 p 个。合起来再扣除两个 n ,得到有 p + q 2 个数,概率为 p + q 2 n 。任意试验 x 次,就有 ( p + q 2 n ) x 的概率会成功。

坑点: n = 1 时要特判。

find_factor (n){
    if ( n == 1 ) return ;
    if ( Miller-Rabin(n) ){  // n 是一个质数
        primelist.add(n);
        return;
    }
    p1=rand(),p2=rand();    // 也可以换成其它数字
    while (1) {         // 记得判断环
        p2=function(p1);    // function 为伪随机数函数
        q=gcd(n,abs(p1-p2));
        if (q!=1){        // 找到一个约数了!
            find_factor(q);
            find_factor(n/q); // 两边递归分解
            return;
        }
        p1=p2;
    }
}

当然,这里使用 O ( 1 ) 的空间产生随机数,只需要存连续两次的随机数种子。记得注意随机数周期循环问题。

时间复杂度 O ( n 4 + . . . . . . )

然而我并不会证明(逃


【部分分讲解】

  • 1 , 2 个测试点只需要模拟 + 快速幂暴力即可。

  • k = 0 时,问题为计算 p h i ( n )

k = 1 时,问题为计算 p h i ( n ) × n 2

计算 p h i ( n ) 公式如下:若 n = i = 1 k p i a i ,则答案为 n × i = 1 k ( 1 1 p i )

【真正的题解】

第一题的 4 次方换成 k 次方时,把第二题的朗格拉日插值替换掉四次方和公式。

最后,质因数分解使用 P o l l a r d R h o M i l l e r R a b i n 算法。

时间复杂度: O ( n 4 + 2 n 的质因子个数             × k )

猜你喜欢

转载自blog.csdn.net/orzzmh/article/details/80918591
今日推荐