JZOJ Day 5 普及模擬 num

2021-08-03 15:28:33 字數 1664 閱讀 6818

題目描述

kc邀請他的兩個小弟k和c玩起了數字遊戲。遊戲是k和c輪流操作進行的,k為先手。kc會先給定乙個數字q,每次操作玩家必須寫出當前數字的乙個因數來代替當前數字,但是這個因數不能是1和它本身。例如當前數字為6,那麼可以用2,3來代替,但是1和6就不行。現在規定第乙個沒有數字可以寫出的玩家為勝者。k在已知q的情況,想知道自己作為先手能不能勝利,若能勝利,那麼第一次寫出的可以制勝的最小數字是多少呢?整個遊戲過程我們認為k和c用的都是最優策略。
輸入

只包括乙個正整數q

輸出第一行是1或2,1表示k能勝利,2表示c能勝利。

若k能勝利,則在第二行輸出第一次寫出的可以制勝的最小數字,若是第一次就無法寫出數字,則認為第一次寫出的可以制勝的最小數字為0。

說明:若c能勝利,不用輸出第二行,輸出2即可。

樣例輸入

樣例輸出

資料範圍限制

對於30%的資料,q<=50; 對於100%的資料,q<=10^13。

分析 這道題分為三種情況:

1:n為質數,writeln(1); write(0);

2:n為兩個質數的乘積(兩個質數可以相等),write(2)

3:n很複雜,則輸出n最小的兩個質因數(可以相等,即n=k*t*t, t為此質因數)的積

程式:

var

i:longint;

j,k,n,m,ans,num:int64;

procedure

aa;begin

readln(n);

m:=n;

for i:=2

to trunc(sqrt(n)-0.1) do

while n mod i=0

dobegin

n:=n div i;

num:=num+1;

end;

if trunc(sqrt(n))=sqrt(n) then inc(num);

n:=m;

if num=0

then

begin

writeln(1);

writeln(0);

halt

endelse

if num=1

then writeln(2) else

begin

ans:=1;

for i:=2

to trunc(sqrt(n)) do

begin

k:=0;

while n mod i=0

dobegin

inc(k);

n:=n div i;

ans:=ans*i;

if ans<>i then

begin

writeln(1);

writeln(ans);

halt;

end;

end;

end;

end;

end;

begin

assign(input,'num.in');

reset(input);

assign(output,'num.out');

rewrite(output);

aa;close(input);

close(output);

end.

JZOJ Day 2 普及模擬 串

題目描述 給定乙個0 1串,請找到乙個盡可能長的子串,其中包含的0與1的個數相等。輸入乙個字串,只包含01,長度不超過1000000。輸出 一行乙個整數,最長的0與1的個數相等的子串的長度。樣例輸入 1011 樣例輸出 2 資料範圍限制 30 的資料 串的長度 20 程式 var s ansistr...

JZOJ Day 1 普及模擬 PLES

題目描述 在舞會上有n個男孩和n個女孩,每個人都量過了自己的身高。每個男孩只跟女孩跳舞,並且女孩也只跟男孩跳舞。每個人最 多只有乙個舞伴。男孩或者想和比自己高的女孩跳舞,或者想和比自己低的女孩跳舞,同樣的,女孩也是或者想和比自己高的男 孩跳舞,或者想和自己低的男孩跳舞。你能決定最多有多少對能在一起跳...

JZOJ Day 4 普及模擬 遊戲

題目描述 guyu guo和tube lu正在玩乙個遊戲 lu默想乙個1和n 之間的數x,然後guo嘗試猜出這個數。guo能提出m個這樣的問題 未知數是否能被yi整除?遊戲按照如下流程進行 guo先給出他想問的全部m個問題,然後lu對所有問題依次以 是 或 否 作答。得到m個問題的答案之後,guo就...