整數的因子和 ---TOJ 1089 Happy 2004


題意


題目鏈接:1089. Happy 2004
這個題目就是求出 2004Xmod29 的結果,其中1X10000000

Input
1
10000
0


Output
6
10


思路


明顯暴力解法肯定會超時, 數論問題首先要從整數的標準分解入手:

N=ki=1paii 其中 pi 是N 的質因子,ai 爲其次數。

例如: 12=223
有了標準分解, 接着考慮 一個整數的是怎麼構成因數的,就是由 質因子及其冪 相互相乘得到的,具體來說就是 我們每次可以取出 pi 的不同次數,來構成因數,這樣就有 0,1,ai ,共有(ai +1) 種選擇。 接着就是一個組合過程,看下面的式子:

ki=1(p0i+p1i++paii)

這個式子展開之後就是 所有的因子相加了 ,正是我們所求的~

下面就是求解這個式子結果了, 取模的話就直接分配進去按照二分冪 取摸,
不過這裏有個技巧:

l Al+xmod m=Axmod m 其中 l[0,m] 成立,

只需要求出循環節 l 即可, 最後加上餘下的那部分數字即可。2004的質因子爲2,3,167
2的冪關於29的循環節是28;
3的冪關於29的循環節是28;
167的冪關於29的循環節是21;
2,3,167的循環節內的和 mod 29 正好爲0;
因此只需要求出 循環節剩下的部分即可~


代碼

#include <iostream>
#include <math.h>
#include <stdlib.h>
using namespace std;
int n;
int main()
{
    while(cin>>n&&n)
    {
        long long a=0,b=0,c=0,t=1;
        for(int i=0; i<(2*n+1)%28;i++)
            a+=(long long)(pow(2.0,i))%29;

        for(int i=0;i<(n+1)%28;i++)
            b+=(long long)(pow(3.0,i))%29;

        for(int i=0;i<(n+1)%14;i++){// 這裏沒有直接使用pow 函數,考慮到pow(167,20) 會超範圍
            c+=t;
            t*=167;
            t%=29;
        }
        cout<<((a%29)*(b%29)*(c%29))%29<<endl;
    }
}
發佈了105 篇原創文章 · 獲贊 48 · 訪問量 50萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章