• 5773. 【NOIP2008模拟】简单数学题


    Description   

      话说, 小X是个数学大佬,他喜欢做数学题。

    有一天,小X想考一考小Y。他问了小Y一道数学题。题目如下:      对于一个正整数N,存在一个正整数T(0<T<N),

    使得 的值是正整数。

          小X给出N,让小Y给出所有可能的T。如果小Y不回答这个神奇的大佬的简单数学题,他学神的形象就会支离破碎。所以小Y求你帮他回答小X的问题。
     

    Input

          一个整数N。
     

    Output

          第一个数M,表示对于正整数N,存在M个不同的正整数T,

    使得 是整数。

    后面是M个数,每一个数代表可能的正整数T(按从小到大的顺序排列)。
     
    Solutions

    设这个式子=K,得T=(2K-2)/(2K-1)*N,

    然后只需枚举N的因数,判断2K-1等于因数时,是否为整数。

    是,算出T,统计答案即可。

    代码

     1 var
     2   n,m:int64;
     3   a:array [0..100001] of int64;
     4 procedure qsort(l,r:longint);
     5 var
     6   i,j:longint;
     7   mid,t:int64;
     8 begin
     9   if l>r then exit;
    10   i:=l; j:=r;
    11   mid:=a[(l+r) div 2];
    12   repeat
    13     while a[i]<mid do inc(i);
    14     while a[j]>mid do dec(j);
    15     if i<=j then
    16       begin
    17         t:=a[i]; a[i]:=a[j]; a[j]:=t;
    18         inc(i); dec(j);
    19       end;
    20   until i>j;
    21   qsort(i,r);
    22   qsort(l,j);
    23 end;
    24 
    25 procedure main;
    26 var
    27   i:longint;
    28   k,t:int64;
    29 begin
    30   m:=0;
    31   for i:=1 to trunc(sqrt(n)) do
    32     if n mod i=0 then
    33       begin
    34         if (i+1) mod 2=0 then
    35           begin
    36             k:=(i+1) div 2;
    37             t:=(k+k-2)*(n div i);
    38             if (t>0) and (t<n) then
    39               begin
    40                 inc(m);
    41                 a[m]:=t;
    42               end;
    43           end;
    44         if (n div i+1) mod 2=0 then
    45           begin
    46             k:=(n div i+1) div 2;
    47             t:=(k+k-2)*i;
    48             if (t>0) and (t<n) then
    49               begin
    50                 inc(m);
    51                 a[m]:=t;
    52               end;
    53           end;
    54       end;
    55 end;
    56 
    57 procedure print;
    58 var
    59   i,t:longint;
    60 begin
    61   t:=0;
    62   for i:=1 to m-1 do
    63     if a[i]=a[i+1] then
    64       inc(t);
    65   write(m-t);
    66   for i:=1 to m do
    67     if a[i]<>a[i+1] then
    68       write(' ',a[i]);
    69 end;
    70 
    71 begin
    72   assign(input,'math.in');
    73   assign(output,'math.out');
    74   reset(input);
    75   rewrite(output);
    76   readln(n);
    77   main;
    78   qsort(1,m);
    79   print;
    80   close(input);
    81   close(output);
    82 end.
  • 相关阅读:
    Managing C++ Objects: 管理C++对象 —— 一些建议准则
    像Java一样管理对象:T&形式仅仅用在参数传递
    Visual Studio的语法着色终于调得赏心悦目
    j.u.c: Java并发包的5大块
    笔记:Java Language Specification
    线程与锁
    分布式系统涉及的基本问题
    微服务为什么是一种趋势
    js实现复制功能
    css label两端对齐
  • 原文地址:https://www.cnblogs.com/zyx-crying/p/9443409.html
Copyright © 2020-2023  润新知