原题:

给定表达式[x/2] + y + x * y, 其中x,y都是正整数。其中的中括号表示下取整,例如[3/2] = 1 , [5/2]  = 2。

有些正整数可以用上述表达式表达出来,

例如正整数2,当取x = y = 1时,可以把2表达出来 ( 解释下:当x=y=1时, [x / 2] + y + x * y = [1 / 2] + 1 + 1 * 1 = 0+1+1 = 2 );

 有些数可以有多种方式表达,例如13可以由 x = 2 y = 4 以及x = 3 y = 3来表示; 

有些数无法用这个表达式表达出来,比如3。

 从1开始第n个不能用这个表达式表示出来的数,我们叫做an,例如a1=1 a2=3,给定n,求an。 

输入:n值 1<=n<=40 输出:an % 1000000007的结果(因为结果较大,输出an %1000000007的结果)。

个人分析:

表达式相当于 (x+1)*y+[x/2]

x=1...n 时,表达式分别为:

2*y  3*y+1  4*y+1  5*y+2 6*y+2  7*y+3 8*y+3 9y+4 10y+4 11y+5 12y+5 ...

这时我们分析:

第一个表达式为 偶数

第二个表达式为 an-1 整除4=0;

第三个表达式为 an-1 整除5=0;

。。。

由此类推

我们在判断 an 这个数是否为 不可表达的数时,应用如下判断

an%2!=0

如果an>1那么 (an-1)%3!=0 并且 因为x=4时,表达式相同 我们也应判断 (an-1)%4!=0

如果an>2那么 (an-2)%5!=0 并且 因为x=4时,表达式相同 我们也应判断 (an-2)%6!=0

.....

那么合适结束呢?判断到an/2,x固定时第一个表达式为最小值

那么我们的判断函数应为:

 public static int givean(int n){if (n < 1 || n > 40)return -1;double result = 0;int countN = 0;while (countN != n){result += 1;//* 以上相当于 (x+1)*y+[x/2]// * 表达式为:x=1...n :  2*y  3*y+1  4*y+1  5*y+2 6*y+2  7*y+3 8*y+3 9y+4 10y+4 11y+5 12y+5 13+6 14+6 15+7 16+7 17+8 18+8 // * 在这里我们可以看出规律,// 当an=3时  我们只需判断 // 1 an-2是否能被5,6整除 // 2 an-1 是否能被3,4整除// 3 an 是否能被2整除//.....如果符合上述条件则可以表达,如果不符合则不可表达bool issuit = false;for (double i = 0; i < result/2; i++){double x = Math.Round(i*2, 0)+1;if (Math.Abs(x - 1) > 0.00001d){//eg: i=1 x=3 x1=4; i=2 x=5 x1=6;i=3 x=7 x1=8double x1 = x + 1;if (Math.Abs((result - i) % x - 0f) < 0.00001d || Math.Abs((result - i) % x1 - 0f) < 0.00001d){issuit = true;break;}}else{if (Math.Abs(result % 2 - 0) < 0.00001d) //x=1 表达式为2*y 偶数全部可以表达{issuit = true;break;}}}//if(!issuit)countN++;}return (int) (result % 1000000007);}

得到的结果为: a1=1 ,a2=3,a3=15,a4=63,a5=4095,a6=65535,a7=262143,a8=...

计算a8就要很长时间了。

这个解决方案是否正确尚未可知,我提交上去代码后却提示:

另外再提交C#代码时,注意将类名改为其他,他与主函数重名会报错。。。

另外不知道庞果检测代码是如何进行的,判断正确与否是怎么个机制,应该是提取方法验证结果与时间吧,

挺有意思的,希望懂行的多交流交流。

看了一下,已经有16个大牛做出来了。

不过,这么多的问题没有答案什么的嘛,或者交流的地方。。。。

2013年8月13日6:38:20早晨 更新 

晚上睡觉的时候想了想,只能优化算法了,目标 取a40  3s内。。。

再循环的时候可以减轻一些压力,首先【 前取整】 代表有连续的两个数相等,所以我们循环的步长可以是2

修改代码如下:

public static int givean(int n){Stopwatch stp=new Stopwatch();stp.Start();if (n < 1 || n > 40)return -1;if (n == 1)return 1;double result = 1;int countN = 1;while (countN != n){//x=1 表达式为2*y 偶数全部可以表达 所以我们支取基数result += 2;//* 以上相当于 (x+1)*y+[x/2]// * 表达式为:x=1...n :  2*y  3*y+1  4*y+1  5*y+2 6*y+2  7*y+3 8*y+3 9y+4 10y+4 11y+5 12y+5 13+6 14+6 15+7 16+7 17+8 18+8 // * 在这里我们可以看出规律,// 当an=3时  我们只需判断 // 1 an-2是否能被5,6整除 // 2 an-1 是否能被3,4整除// 3 an 是否能被2整除//.....如果符合上述条件则可以表达,如果不符合则不可表达bool issuit = false;//y=1,2....n : 1+x+[x/2] 2+2x+[x/2] 3+3x+[x/2] ...n+nx+a//x的值取y=1时 的最大值为double limit = result - 1;//x=2,3...时的表达式判断[2/2]=[3/2] [x/2]=[x+1/2]所以x的步长为2,一次判断两个for (double x = 2; x <= limit; x += 2){////[x/2]double yushu = Convert.ToInt64(x/2);double a = x + 1;//系数////limit = result - yushu - 1;//if (Math.Abs((result - yushu) % a - 0f) < 0.00001d ||Math.Abs((result - yushu) % (a+1) - 0f) < 0.00001d){issuit = true;break;}}if (!issuit){countN++;Console.WriteLine("N=" + countN + "  an=" + result);}}stp.Stop();TimeSpan ts = stp.Elapsed;string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds / 10);Console.WriteLine("Time taken : {0}", elapsedTime);return (int) (result % 1000000007);}

运行的结果是:

N=2  an=3
N=3  an=15
N=4  an=63
N=5  an=4095
N=6  an=65535
N=7  an=262143
Time taken?:?00:00:00.11

计算n=8时 需要5分多钟。。。。太让人郁闷了。

开来还是有优化的地方。。。。

2013年8月13日8:17:35 第二次更新

重新更改了一下:

这下取n=8 控制到5分钟以内了,代码如下:

 public static int givean(int n){Stopwatch stp=new Stopwatch();stp.Start();if (n < 1 || n > 40)return -1;if (n == 1)return 1;double result = 1;int countN = 1;while (countN != n){//x=1 表达式为2*y 偶数全部可以表达 所以我们支取基数result += 2;//* 以上相当于 (x+1)*y+[x/2]// * 表达式为:x=1...n :  2*y  3*y+1  4*y+1  5*y+2 6*y+2  7*y+3 8*y+3 9y+4 10y+4 11y+5 12y+5 13+6 14+6 15+7 16+7 17+8 18+8 //  2y+0   3y+1   4y+1 5y+2 6y+2 7y+3 8y+3 9y+4 10y+4//11y+5  12y+5   13y+6  14y+6 15y+7 16y+7 18y+8 19y+8 20y+9 21y+9////eg:result=5 5*2/3=3 (3+1)*1+1=5long tmpx = Convert.ToInt64(result*2/3);if ((tmpx + 1 + Convert.ToInt64(tmpx / 2)) == Convert.ToInt64(result))continue;//// * 在这里我们可以看出规律,// 当an=3时  我们只需判断 // 1 an-2是否能被5,6整除 // 2 an-1 是否能被3,4整除//.....如果符合上述条件则可以表达,如果不符合则不可表达bool issuit = false;//y=1,2....n : 1+x+[x/2] 2+2x+[x/2] 3+3x+[x/2] ...n+nx+a//x的值取y=1时 的最大值为double limit = result - 1;//x=2,3...时的表达式判断[2/2]=[3/2] [x/2]=[x+1/2]所以x的步长为2,一次判断两个for (double x = 2; x <= tmpx; x += 2){////此x值得表达式为 a * y + yushudouble yushu = Convert.ToInt64(x/2);double a = x + 1; //系数double a2 = x + 2;////此时,如果系数与加数同为偶数时 可以不用判断//if (Math.Abs(yushu % 2 - 0) > 0.00001d || Math.Abs(a % 2 - 0) > 0.00001d){if (Math.Abs((result - yushu)%a - 0f) < 0.00001d){issuit = true;//Console.WriteLine(x+"");break;}}// Math.Abs((result - yushu)%(a + 1) - 0f) < 0.00001dif (Math.Abs(yushu % 2 - 0) > 0.00001d || Math.Abs(a2 % 2 - 0) > 0.00001d){if (Math.Abs((result - yushu) % a2 - 0f) < 0.00001d){issuit = true;//Console.WriteLine(x+1 + "");break;}}}if (!issuit){countN++;Console.WriteLine("N=" + countN + "  an=" + result);}}stp.Stop();TimeSpan ts = stp.Elapsed;string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds / 10);Console.WriteLine("Time taken : {0}", elapsedTime);return (int) (result % 1000000007);}

想了一下,如果数据变大时比如10000001时,要验证的太多了,也即循环耗费时间太长了,

看来规律总结的不到位啊。

2013年8月14日15:05:09更新

看了http://blog.csdn.net/chengyxc/article/details/9958035 他这个算法似乎是对的,

符合的条件:n具有2^m-1的形式,并且,2n+1必定是个素数,这样的数才是不可能数

跟着更新了下算法。

但是 好像还是不能很好的实现。时间是个大问题,算到第21个数了,用时大约10s了。

肯定超限了。

算法如下:

 Stopwatch stp=new Stopwatch();stp.Start();long inf = 140000000;// int.MaxValue;// 264800000;// 2147483637; //List<int> prime = new List<int>();int[] prime = new int[inf];prime[0] = prime[1] = 0;for (int i = 2; i < inf; ++i)prime[i] = 1;for (int i = 4; i < inf; i += 2)prime[i] = 0;double t = Math.Sqrt(inf);for (int i = 3; i <= t; i += 2){if (prime[i]>0){int k = i * i, p = i + i;for (int j = k; j < inf; j += p){prime[j] = 0;//if ((j - 1)%2 == 0)//    Console.WriteLine("j="+j+"  "+(j - 1) /2 + "");}}}//以上得到了 1 -- inf 范围 中的所有素数,在素数中判断条件int count = 1;for (long i = 0; i < prime.LongLength; i++){if (prime[i] != 0){if ((i - 1)%2 == 0){//符合2n+1为素数double n = (i - 1)/2;if (n < 3)continue;//符合2^M-1double a = Math.Log(n + 1, 2); // Math.Log(2, n + 1);double b = (a - Convert.ToInt64(a));if (a != double.NaN && a > 1 && Math.Abs(a - Convert.ToInt64(a)) < 0.000001d){count++;//Console.WriteLine(string.Format("n={0} an={1}",count,n));}}}}stp.Stop();Console.WriteLine(stp.ElapsedMilliseconds/1000d+"S");//

输出结果为:

n=2 an=3
n=3 an=15
n=4 an=63
n=5 an=4095
n=6 an=65535
n=7 an=262143
n=8 an=2097150
n=9 an=8388606
n=10 an=33554409
n=11 an=33554418
n=12 an=33554429
n=13 an=33554439
n=14 an=67108824
n=15 an=67108844
n=16 an=67108878
n=17 an=67108886
n=18 an=67108889
n=19 an=67108890
n=20 an=67108899
n=21 an=67108901
9.854S

我的是32位系统,数组最大长度只能设为:264800000 再长就报超出内存了。也不知道是不是系统的问题。64位系统的验证一下吧。


庞果答题:亿阳信通:不可表示的数 的一个人见解(8-13第二次更新。)相关推荐

  1. 庞果网之杨辉三角的变形

    题目详情 1 1   1  1 1  2   3  2  1 1  3  6   7  6  3  1 以上三角形的数阵,第一行只有一个数1, 以下每行的每个数,是恰好是它上面的数,左上的数和右上数等 ...

  2. 庞果网练习题——魔法

    庞果网练习题--魔法 自己做着玩的,欢迎指正.指点.一起讨论. 题目详情 你拥有3种魔法,可以用第一种魔法把 a 克的沙子变成 b 克金属,可以用第二种魔法把 c 克金属变成 d 克金子,可以用第三种 ...

  3. 回文字符串——庞果网

    题目依旧是来自庞果网. 题目详情: 回文字符串是指从左到右和从右到左相同的字符串,现给定一个仅由小写字母组成的字符串,你可以把它的字母重新排列,以形成不同的回文字符串. 输入:非空仅由小写字母组成的字 ...

  4. 【疯狂诗词大会小程序2.0】功能模块+前端+诗词答题小程序+内置数千道题目+开箱即用

    源码简介与安装说明: 模块介绍: 诗词答题小程序,支持单项选择题.文字线索题.看图猜诗词.读诗句猜谜等题目类型. 内置数千道题目,开箱即用.随机出题,先易后难. 诗词同步学,每一道诗题都配备了优质的诗 ...

  5. 庞果网之建立信号基站

    题目详情 要建立一个信号基站服务n个村庄,这n个村庄用平面上的n个点表示.假设基站建立的位置在(X,Y),则它对某个村庄(x,y)的距离为max{|X – x|, |Y – y|}, 其中| |表示绝 ...

  6. 庞果网之字符串的完美度

    题目详情 我们要给每个字母配一个1-26之间的整数,具体怎么分配由你决定,但不同字母的完美度不同, 而一个字符串的完美度等于它里面所有字母的完美度之和,且不在乎字母大小写,也就是说字母F和f的完美度是 ...

  7. 关于庞果网数组排序的问题

    昨天在庞果网看了个题目,难度只有两星(最高为五星),看似简单,120分钟内却没有做出来,深受打击!想了一晚上,终于感觉能给出个可用的算法了.题目如下:   题目并不要求排序, 只是让求出如果排序最少需 ...

  8. 庞果网之寻找直方图中面积最大的矩形

    题目详情 给定直方图,每一小块的height由N个非负整数所确定,每一小块的width都为1,请找出直方图中面积最大的矩形. 如下图所示,直方图中每一块的宽度都是1,每一块给定的高度分别是[2,1,5 ...

  9. 人才招聘新趋势:垂直性的社交网络——pongo网(庞果网)CEO李炯明专访

    记者 / 长卿 近日,国内专业IT人才招聘服务公司Careerfocus联合全球最大中文IT社区CSDN推出了IT行业细分的招聘求职网站pongo(庞果网),力图通过搜索引擎,垂直型社交网络构建IT行 ...

  10. 庞果网 英雄会 最小公倍数

    import java.io.BufferedInputStream; import java.util.LinkedList; import java.util.Scanner;/*** @auth ...

最新文章

  1. pom.xml常用元素解析
  2. linux怎么增加cpu负载,Linux下的CPU平均负载
  3. Lesson 14.3 Batch Normalization综合调参实战
  4. 基于行为树的新手引导设计
  5. 查询附近的人——GEO
  6. 字符串查找KMP算法(转)
  7. POJ 1252 Euro Efficiency
  8. mac os 录屏快捷键_录屏软件怎么录制电脑游戏?录制游戏视频须知
  9. 一、Vulkan开发理论基础知识
  10. 微信小程序——new Date()显示NAN + 正则表达式
  11. 【数据库】03——初级开发需要掌握哪些SQL语句
  12. correl函数相关系数大小意义_correl(correl函数相关系数大小意义)
  13. 变送器和传感器有什么区别和联系?
  14. 机器学习算法之贝叶斯算法 3、案例二:新闻数据分类
  15. 怎么用html写一个学校代码,[代码学校]简单实用的HTML代码分享_格桑梅朵_天涯部落_天涯社区...
  16. 三、基于ZK实现分布式锁
  17. C#后台生成画报(海报)
  18. souce Insight的使用方法整理
  19. 点云配准方法:ICP与GICP
  20. bzoj4004[JLOI2015]装备购买

热门文章

  1. 程序员在Medium上写作赚美金的基本流程
  2. Anaconda Prompt :python.exe - 无法找到入口,无法定位程序输入点
  3. 通货膨胀率固定时,贷款利率多大,贷款买房才和存款攒钱一样划算?
  4. 笔记本用HDMI转VGA转接线后,显示器没声音的解决方法
  5. 为什么要有虚拟内存?
  6. 华硕服务器怎么装win7系统教程,华硕win7系统重装教程
  7. 手机上最好用的五笔输入法_什么手机输入法最实用?目前最受欢迎的3款盘点,你正在用哪款呢...
  8. 计算机网络的硬件系统包含那些部件,计算机的硬件系统主要包括哪五大部件
  9. 2022年湖北省住建厅特种作业操作证怎么报考?甘建二
  10. 通过xml方式根据word模板导出word