題意
題目鏈接:1089. Happy 2004
這個題目就是求出
Input
1
10000
0
Output
6
10
思路
明顯暴力解法肯定會超時, 數論問題首先要從整數的標準分解入手:
N=∏ki=1paii 其中pi 是N 的質因子,ai 爲其次數。
例如:
有了標準分解, 接着考慮 一個整數的是怎麼構成因數的,就是由 質因子及其冪 相互相乘得到的,具體來說就是 我們每次可以取出
∏ki=1(p0i+p1i+…+paii)
這個式子展開之後就是 所有的因子相加了 ,正是我們所求的~
下面就是求解這個式子結果了, 取模的話就直接分配進去按照二分冪 取摸,
不過這裏有個技巧:
∃l Al+xmod m=Axmod m 其中l∈[0,m] 成立,
只需要求出循環節
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;
}
}