機械人m號
【問題描述】
2023年,
macsy
正在火星部署一批機械人。
第1秒,他把機械人
1號運到了火星,機械人
1號可以製造其他的機械人。
第2秒,機械人
1號造出了第乙個機械人——機械人2號。
第3秒,機械人
1號造出了另乙個機械人——機械人3號。
之後每一秒,機械人1
號都可以造出乙個新的機械人。第
m秒造出的機械人編號為
m。我們可以稱它為機械人
m號,或者
m號機械人。
機器人造出來後,馬上開始工作。m
號機械人,每
m秒會休息一次。比如
3號機械人,會在第6,
9,12,……秒休息,而其它時間都在工作。
機械人休息時,它的記憶將會被移植到當時出生的機械人的腦中。比如6
號機械人出生時,2,
3號機械人正在休息,因此,
6號機械人會收到第2,
3號機械人的記憶副本。我們稱第2,
3號機械人是
6號機械人的老師。
如果兩個機械人沒有師徒關係,且沒有共同的老師,則稱這兩個機械人的知識是互相獨立的。注意:1
號機械人與其他所有機械人的知識獨立(因為只有
1號才會造機械人),它也不是任何機械人的老師。
乙個機械人的獨立數,是指所有編號比它小且與它知識互相獨立的機械人的個數。比如1
號機械人的獨立數為0,2
號機械人的獨立數為1(1
號機械人與它知識互相獨立),
6號機械人的獨立數為2(1
,5號機械人與它知識互相獨立,2,
3號機械人都是它的老師,而
4號機械人與它有共同的老師——
2號機械人)。
新造出來的機械人有3
種不同的職業。對於編號為
m的機械人,如果能把
m分解成偶數個不同奇素數的積,則它是政客,例如編號
15;否則,如果
m本身就是奇素數或者能把
m分解成奇數個不同奇素數的積,則它是軍人,例如編號
3, 編號
165。其它編號的機械人都是學者,例如編號
2, 編號
6, 編號9。
第m秒誕生的機械人
m號,想知道它和它的老師中,所有政客的獨立數之和,所有軍人的獨立數之和,以及所有學者的獨立數之和。可機械人m
號忙於工作沒時間計算,你能夠幫助它嗎?
為了方便你的計算,macsy
已經幫你做了
m的素因子分解。為了輸出方便,只要求輸出總和除以
10000
的餘數。
【輸入檔案】
輸入檔案robot.in的第一行是乙個正整數k(1<=k<=1000),k
是m的不同的素因子個數。
以下k行,每行兩個整數,
pi, ei,表示m的第i
個素因子和它的指數
(i = 1, 2, …, k)。
p1, p2, …, pk是不同的素數,。所有素因子按照從小到大排列,即p12<=pi<10,000, 1<=ei<=1,000,000。
【輸出檔案】
輸出檔案robot.out包括三行。
第一行是機械人m
號和它的老師中,所有政客的獨立數之和除以10000
的餘數。
第二行是機械人m
號和它的老師中,所有軍人的獨立數之和除以10000
的餘數。
第三行是機械人m
號和它的老師中,所有學者的獨立數之和除以10000
的餘數。
【樣例輸入】
32 1
3 2
5 1
【樣例輸出】86
75【樣例說明】
。90號機械人有10
個老師,加上它自己共
11個。其中政客只有15號;軍人有3號和5
號;學者有
8個,它們的編號分別是:2,6,9,10,18,30,45,90。
【評分標準】
輸出檔案包含三個數。如果你的程式算對了三個數,該測試點得10
分;如果你的程式算對了兩個數,該測試點得
7分;如果你的程式算對了乙個數,該測試點得
4分;如果你的程式乙個數也沒算對,該測試點得0分;
不難得出,每個數的獨立數是與它互質的,所以這個數的獨立數的個數就是他的尤拉函式。
首先,說乙個定理:乙個數的所有因子的尤拉函式和為這個數減一。證明嘛,本蒟蒻不會。。。。。。
然後嘞,至於軍人和政客,是這麼求的:
f[i,j]:=(f[i-1,j]+f[i-1,j-1]*(a[i,1]-1)) (其中 ,a[i,1] 為每乙個質因子,a[i,2] 為每乙個質因子的指數)
然後,不要忘了特判質因子為 2 的時候,然後政客:sigma(f[n,i],i mod 2=0) 軍人:sigma(f[n,i],i mod 2<>0) 學者是用這個數所有因子的尤拉函式和減去前兩個數。
然後,不要忘了用快速冪。
再然後,快速冪的時候,存 sqrt(ans) 的時候要用 int64 。
再再然後,快速冪要這麼寫:
function ks(d,z:longint):longint; inline;
var temp:int64;
begin
if z=1 then exit(d);
if z=0 then exit(1);
temp:=ks(d,z>>1) mod 10000;
if z mod 2=0 then exit((temp*temp) mod 10000)
else exit((temp*temp*d) mod 10000);
end;
不要這麼寫:
function ks(d,z:longint):longint; inline;
begin
if z=1 then exit(d);
if z=0 then exit(1);
if z mod 2=0 then exit((ks(d,z>>1)*ks(d,z>>1)) mod 10000)
else exit(((ks(d,z>>1)*ks(d,z>>1)) mod 10000*d) mod 10000);
end;
因為這樣是算兩遍啊白痴!
** suemiller
program acrush;
var i,j,k,n,tot:longint;
a:array[0..1010,1..2]of longint;
f:array[0..1010,0..1010]of integer;
ans1,ans2,ans3:longint;
function ks(d,z:longint):longint; inline;
var temp:int64;
begin
if z=1 then exit(d);
if z=0 then exit(1);
temp:=ks(d,z>>1) mod 10000;
if z mod 2=0 then exit((temp*temp) mod 10000)
else exit((temp*temp*d) mod 10000);
end;
begin
// assign(input,'robot.in');reset(input);
// assign(output,'robot.out');rewrite(output);
readln(n);
ans3:=1;
readln(a[1,1],a[1,2]);
if a[1,1]=2 then
begin
ans3:=(ans3*ks(2,a[1,2])) mod 10000;
k:=1;
dec(n);
endelse k:=2;
for i:=k to n do
begin
readln(a[i,1],a[i,2]);
end;
for i:=1 to n do
begin
ans3:=(ans3*ks(a[i,1],a[i,2])) mod 10000;
// writeln('^^^ ',ks(a[i,1],a[i,2]));
end;
// writeln(ans3);
f[0,0]:=1;
for i:=1 to n do
begin
f[i,0]:=1;
for j:=1 to i do
begin
f[i,j]:=(f[i-1,j-1]*(a[i,1]-1)+f[i-1,j]) mod 10000;
end;
end;
for i:=n downto 1 do
begin
if i=((i>>1)<<1) then inc(ans1,f[n,i])
else inc(ans2,f[n,i]);
// writeln(i,' ',f[n,i],' &&');
end;
if ans1>10000 then ans1:=ans1 mod 10000;
if ans2>10000 then ans2:=ans2 mod 10000;
ans3:=ans3-ans1-ans2-1;
while ans3<0 do inc(ans3,10000);
writeln(ans1);
writeln(ans2);
writeln(ans3);
// close(input);close(output);
end.
解題報告 NOI2002 銀河英雄傳說
處理m個指令,都為兩種如下形式的指令之一 1.m i j 表示讓第i好戰艦所在列的全部戰艦保持原有順序,接在第j好戰艦所在列的尾部。2.c i j,表示詢問第i號戰艦與第j號戰艦當前是否處於同一列中,如果在同一列中,它們之間間隔了多少艘戰艦。如果不在同一列中,輸出 1 並查集第二個指令我們要知道i,...
POJ 2002 Squares解題報告
題目大意 給你乙個二維平面上面的n 1000 個點的座標 每個點座標都不超過20000 讓你找出有多少個正方形。給了三秒半 思路 還是先看一眼暴力列舉,4個點的所有可能組合為n 4肯定超時了。列舉每兩個點的組合o n 2 然後看是否存在可以和他們組成正方形的點。即該位置上是否有點 用雜湊表可以將查詢...
NOI2017 遊戲 解題報告
d 這麼小,你考慮直接對 d 個東西暴力 列舉 x 為 a 或 b c 就不用了,因為 a,b 已經包含 c 了,剩下的就是個 2 sat 問題了 但是你發現有個情況是,在若 a 即 b 時,如果 b 被 ban 了,那麼 a 也要被 ban 我們記錄一下被 ban 的點,然後在球方案的時候判一下 ...