アイヤニャー(特判と大数)

1513 ワード

タイトルの説明:
艾星人とニャンコ人が戦いました!
しかしCWYは、これは大宇宙の意志の「陰謀」にすぎず、艾星とニャンコ星の人口数をコントロールすることを目的としていることを発見した.
戦争の最後の結果は共倒れで人口が激減したにほかならない.
しかしCWYは艾星と猫星の人口総数がどれだけなのかを知り、戦争の死傷者を予知したい.
艾星とニャンコ星の人口総数はnで、それぞれ1~nの符号で、艾星人の符号は1~nの中で与えられた等差数列または等比数列に属する数字である.
等差数列の最初のa、公差b、等比数列の最初のc、公比dを与えて、あなたの任務は艾星人の個数を求めることです.
入力形式:
1行、5つの整数、それぞれa,b,c,d,nである.
(1≤a,b,c,n≤1012,  1≤d≤105.)
80%のデータに対して、1≦n≦1000000である.
出力フォーマット:
1つの整数で、艾星人の数を表します.
入出力サンプル:
入力サンプル
1  1  1  2  1000
3  3  1  2  1000
452  24  4  5  600
出力サンプル
1000
343
10
サンプル解釈
発生する等差数列は:1,2,3,4,....生成された等比数列は:1,2,4,8,....だから【11000】の範囲内のすべての記号は艾星人のものです.
 
艾星人の10個の数はそれぞれ:4で、2010,045247650524548572596
 
 
今日はなぜかデバッガが暴走・・・
そしてa>nの特判を逆にする
この問題はまず等比を算出して、更に等差(指数関数はとても速くて、int 64を使うことを覚えています)を計算して、更に特判します
Program queue;
var
   a,b,c,d,n,ans,i,ii:int64;
function is_ok:boolean;
begin
   if (a>n) then exit(false);

   if (c-a>=0) then
      if ((c-a) mod b=0) then
         if ((c-a) div b>=-1) then exit(true);
   exit(false);

end;
begin
   assign(input,'queue.in');
   assign(output,'queue.out');
   reset(input);
   rewrite(output);


   read(a,b,c,d,n);
   if (a>n) then ans:=0
   else ans:=(n-a) div b+1;

   while (c<=n) do
   begin
      if (not(is_ok) ) then inc(ans);
      c:=c*d;
      if (d=1) then break;
   end;
   writeln(ans);

   close(input);
   close(output);

end.