Synchronicity

题目描述
大家知道什么叫做Synchronicity吗,其中文翻译为“共时性”,这是荣格对一些超自然的现象做出的解释。这些现象包括“说曹操曹操到”,“噩梦成真”等……说这么学术干嘛?Synchronicity不就是LMZ最爱的一首歌嘛!
说到共时性,“心有灵犀”也是一种类似的现象。话说法伊和由伊是双胞胎,他们俩由于在“时间之塔”里关了几百年,所以知识不够。他们现在在上数学课,然后在质因数。当然,他们俩很聪明,已经开始学习举一反三了。由伊随口说出一个n和p,法伊立刻就能说出最小质因子为p的第n个正整数(即恰好有n-1个最小质因子为p且比它小的数),其中p一定是质数。法伊之后又沉睡了,为了缓解由伊的寂寞,黑钢想代替法伊承担其任务。但是黑钢明显无法很快想到答案,于是就让你帮他想吧。
输入
仅一行2个正整数n,p,意义如题。
输出
仅输出一个非负整数,为最小质因子为p的第n个正整数。若答案大于109则输出0.
样例输入
2 3
样例输出
9
提示
[样例解释]

最小质因子是3的正整数中,第一个是3,第二个是9,第三个是15……

[数据范围与约定]
对于60%的数据:p>=50
对于100%的数据:1<=n,p<=109

当n≥29时,枚举p的倍数,暴力可过。
当n<29时:暴力枚举不可过
开始找规律—发现循环节
设C为≤p的素数之积
证明:
若P<29,可以直接计算,设C为<=P的质数的积,由于P不大,C只是百万级的,硬统计C内有多少个符合要求,设符合要求的个数为c,则答案为((N-1)/c)*C+a[(N-1)%c+1],其中a[i]为第i个符合要求的数,现证明其正确性。
我们认为,若i合法,则C+i合法。
现反设C+i非法,则存在p< P满足p|C+i,因为C为< =P的质数的积,所以p|C,所以p|i,与假设矛盾,得证。

const maxn=1000000000;
var
a:array[0..11] of longint;
ans:array[0..5000000] of int64;
n,j,num,tot:longint;
sum,ans2,i,p:int64;
flag:boolean;
begin
  a[1]:=2;a[2]:=3;a[3]:=5;a[4]:=7;a[5]:=11;
  a[6]:=13;a[7]:=17;a[8]:=19;a[9]:=23;a[10]:=29;
  readln(n,p);
  if n=1 then begin write(p); exit; end;
  if p>sqrt(maxn) then begin write('0'); exit; end;
  if p*n>maxn then begin write('0'); exit; end;
  if p>=29 then
  begin
    num:=1;
    i:=p*p;
    repeat
      flag:=false;
      for j:=2 to p-1 do
        if i mod j=0 then begin flag:=true; break; end;
      if flag=false then num:=num+1;
      if num=n then begin write(i); exit; end;
      i:=i+p;
    until i>maxn;
    if num<n then write('0');
  end
  else
  begin
    num:=1;
    sum:=1;
    while a[num]<=p do
    begin
      sum:=sum*a[num];
      num:=num+1;
    end;
    num:=num-1;
    i:=p;
    repeat
      flag:=false;
      for j:=1 to num do
        if (i mod a[j]=0)and(a[j]<p) then begin flag:=true; break; end;
      if flag=false then begin tot:=tot+1; ans[tot]:=i; end;
      i:=i+p;
    until (i>sum)or(i>maxn);
    ans2:=(n-1) div tot*sum+ans[(n-1) mod tot+1];
    if ans2>maxn then write('0') else write(ans2);
  end;
end.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值