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.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值