生活随笔
收集整理的這篇文章主要介紹了
HDU2683——欧拉完全数
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目要求符合等式的數,我們首先要做的就是分析這個數:
對于這個等式,我們可能什么都看不出來,左邊很難化簡的樣子,所以我們就要想到通過變化怎么樣把右邊化成和左邊形式差不多的樣子。結合組合數我們想到二項式定理,展開得到
左邊等于右邊的話我們可以得到g(n)=2*n,因為n本身為自身的因子,那么n的小于自身的因子之和為自身說明n為完全數。
所以問題轉換為如何求完全數。
由數論知識得任何一個完全數都可以寫成 2p-1 *(2p-1)的形式,其中(2p-1)為素數(也叫做梅森素數)
梅森素數的條件為p為素數。
由以上(我靠比賽我到哪去找這些知識點),我們可以找到所有的完全數(其實也沒有幾個)
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<map>
#include<queue>
#include<set>
#include<vector>using namespace std
;typedef long long ll
;
const int MAXN
=1e5+5;ll
mult(ll x
,ll y
,ll p
)
{long double d
=1;d
=d
*x
/p
*y
; return ((x
*y
-((ll
)d
)*p
)%p
+p
)%p
;
}ll
quick_pow(ll a
,ll b
,ll p
)
{ll ret
=1; a
%=p
;while(b
){if(b
&1) ret
=mult(ret
,a
,p
);a
=mult(a
,a
,p
); b
>>=1;}return ret
;
}bool Miller_Rabin(ll n
)
{const ll times
=8;const ll prime
[8]={2,3,5,7,11,13,17,61};if(n
<2) return false; if(n
==2) return true;for(int i
=0;i
<times
;i
++)if(n
==prime
[i
]) return true; else if(!(n
%prime
[i
])) return false;ll x
=n
-1; while(!(x
&1)) x
>>=1;for(int i
=0;i
<times
;i
++){ll a
=prime
[i
]; ll now
=quick_pow(a
,x
,n
); ll last
;if(x
==n
-1){if(now
!=1) return false;}else{bool flag
=false;while(x
!=n
-1){last
=now
; now
=mult(now
,now
,n
);if(now
==1){if(last
==n
-1 || last
==1) flag
=true; break;}x
<<=1;}if(!flag
) return false;}}return true;
}ll
quick_pow(ll a
,ll b
)
{ll ret
=1;while(b
){if(b
&1) ret
*=a
;a
*=a
; b
>>=1;}return ret
;
}const int prime
[11]={2,3,5,7,11,13,17,19,23,29,31};int main()
{
char cmd
[5]; ll a
,b
;const ll ans
[8]={6,28,496,8128,33550336,8589869056,137438691328,2305843008139952128};while(~scanf("%s",cmd
)){if(cmd
[0]=='A'){scanf("%lld%lld",&a
,&b
);if(b
<a
) swap(a
,b
);int cnt
=upper_bound(ans
,ans
+8,b
)-lower_bound(ans
,ans
+8,a
);printf("%d\n",cnt
);}else{scanf("%lld",&a
);printf("%d\n",upper_bound(ans
,ans
+8,a
)-lower_bound(ans
,ans
+8,a
));}}return 0;
}
總結
以上是生活随笔為你收集整理的HDU2683——欧拉完全数的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。