題目描述
有n個格仔,每個格仔裡有乙個數,1,2,3,4…n
牛牛放出無窮只青蛙。
第一只青蛙的路線是:1->2->4->8->16->…
第二隻青蛙的路線是:1->3->9->27->81->…
第三隻青蛙的路線是:1->5->25->125…
第四只青蛙的路線是:1->7->49…
。。。。。。
用數學語言描述,第 只青蛙的路線是首項為1,公比為的等比數列,其中代表第個素數。
當青蛙跳到乙個格仔上,如果這個格仔上面有乙個數,青蛙就會把這個數吃掉。
牛牛想知道,所有沒有被吃掉的數的lcm(最小公倍數 ,least common multiple)是多少?
由於這個lcm可能非常大,請輸出它對取模的值。
輸入描述:
乙個正整數
輸出描述:
如果所有數都被吃掉了,請輸出乙個字串"empty"
否則輸出所有沒有被吃掉的數的lcm,對取模
示例1輸入複製7
輸出複製6說明
數字 1 可以被所有青蛙吃掉;
數字 2 可以被第 1 只青蛙吃掉;
數字 3 可以被第 2 只青蛙吃掉;
數字 4 可以被第 1 只青蛙吃掉;
數字 5 可以被第 3 只青蛙吃掉;
數字 6 無法被吃掉;
數字 7 可以被第 4 只青蛙吃掉。
所以剩下的數字只有乙個 6 ,所有數的 lcm 為 6
示例2輸入
複製123456789
輸出複製
539747460
題意大概就這個意思
所有的素數的k次冪都沒了
然後求剩下的所有數的lcm
對於剩餘的 滿足什麼條件呢 被吃掉的數字全部都是某個素數的k次冪
那麼說明剩下的數字都是兩個以上不同的素數的某個k次冪相乘組成的
又因為每個素數是互質的 那麼求lcm 就只需要求出每個素數出現的最大次數 然後全部相乘就可以了
那怎麼求某個素數出現的最大次數呢 ?
我們知道 至少兩個素數相乘
那麼 當i=2的時候 他出現的最大次數就是log2(n/3) n/3說明 2和3兩個素數組成的 n/3剩下的都是2組成的 然後取log就是2出現的最大次數
對於x。。。。。 出現次數等於logx(n/2) 為什麼n/2呢 這樣是為了保證剩餘的數最大 為了讓x出現的次數更多
又因為至少兩個素數相乘 那麼x最大為n/2 所以曬素數的時候 2~n/2即可
#include
#include
#include
using
namespace std;
typedef
long
long ll;
typedef pair<
int,
int> pii;ll mod=
1e9+7;
intqow_m
(int n,
int w)
return k%mod;
}const
int maxn =
1e6+7;
ll sum=1;
ll n,m,k,wz,cnt=
0,h,ans=0;
ll x,y=0;
int ok[
80000100];
ll s[
10000000];
//int sum[maxn];
void
slu(ll n)}}
intmain()
else}if
(sum==1)
cout<<
"empty"
;else
cout<
return0;
}
一群小朋友在玩老鷹捉小雞
我正奇怪的逛街 今天的我正奇怪的逛街,一群小朋友在玩老鷹捉小雞,在一起就打架,就象橫衝直撞的戰車,爺爺常說,乙個小朋友當老鷹,它的羽毛已經脫落得差不多了,乙個小朋友當母雞,所以爺爺給她起了綽號,呂仕清的三個兵已經過河了。牢牢地守著那位老將,一給叫李杉李杉是二叔家的小寶寶,老虎不是很厲害的逛街嗎,不會...
引用 大局之困 救乙個遵紀小孩還是一群違紀小孩
大局上面仍然有大局,規範也僅在相對環境裡存在,因此,在某種情況下,規範必須向大局妥協 目前,網上流傳著乙個小故事,且不論這個故事是否確有其事,聽起來還是饒有興趣且頗需思量的 有一群小朋友在兩組鐵軌上玩,一組還在使用,一組已經停用。眾多小朋友集中在仍然使用的鐵軌上玩,只有乙個小孩子選擇了停用的鐵軌。很...