为什么说数学能力非常重要,见一道实际比赛的水题 Problem 1001 A water problem作者:queuelovestack Time Limit: 5000/2500 MS (Java/Others) Memory Limit : 65536/65536 K (Java/Others) Problem Description: Two planets named Haha and Xixi in the universe and they were created with the universe beginning.There is 73 days in Xixi a year and 137 days in Haha a year. Now you know the days N after Big Bang, you need to answer whether it is the first day in a year about the two planets. Input There are several test cases(about 5 huge test cases).For each test, we have a line with an only integer N(0≤N), the length of N is up to 10000000. Output For the i-th test case, output Case #i: , then output “YES” or “NO” for the answer. Sample Input 10001 0 333 Sample Output Case #1: YES Case #2: YES Case #3: NO
题目要点: 如题意“一年里的第一天”如何理解?天数N(0≤N),就是第0天;印证,input中case#2的情况;因此用“求余数%”计算即可。(两个信息给一个就足够了,因为water problem,所以都给了) 如题意天数N的描述:“the length of N is up to 10000000”,此时容易入坑,10000000是数的位数的下限,一个超大数如何处理?int变量有上下限,但字符串没有,因此通常用字符串输入N即可。(scanf("%s",s);然后常规方法字符串转数,求每一位的数字,s[i]-‘0’,最常用的固定代码),后面的分析和代码示例中令N为大数的位数。 重要:大数求模,基本算法如下:(令k为循环变量) 通常,二重循环可能不能满足Time Limit,最好优化成一重循环的迭代 (本题“难点”:加法迭代乘法迭代) 关键代码: const int N = 10000005; char s[N]; int main() { int ans1,ans2,p=1,i,k; while(~scanf("%s",s)) //scanf成功有返回值0,平时不常用 { ans1=ans2=0; k=strlen(s); for(i=0;i<k;i++) { ans1=(ans110+s[i]-‘0’)%73; ans2=(ans210+s[i]-‘0’)%137; } if(!ans1&&!ans2) printf(“Case #%d: YES\n”,p++); else printf(“Case #%d: NO\n”,p++); } return 0; } 2. 补充:Special Judge 特判:对于同一道题目,用户可能使用各种不同的方法来解答,所以对于某些特殊的题目,其结果可能不唯一,但都符合题目要求。此类题目就需要进行特判(Special Judge) 。一个题目可以接受多种正确答案,即有多组解的时候,题目就必须被定义为Special Judge。 Special Judge程序使用输入数据和一些其他信息来判答你程序的输出,并将判答结果返回。 给一个例子,再强调一下数学的重要性: 分析: 根据“费马大定理”(当整数n >2时,关于x, y, z的方程 x^n + y^n = z^n 没有正整数解),因此只考虑n=1, n=2, n=0 当n=0时,肯定不成立; 当n=1时,该题是特判,所以输出一组就OK; 当n=2时,勾股数。 补充勾股数相关算法:所谓勾股数,一般是指能够构成直角三角形三条边的三个正整数(例如a,b,c)。即a2+b2=c^2,a,b,c∈N 又由于,任何一个勾股数组(a,b,c)内的三个数同时乘以一个整数n得到的新数组(na,nb,nc)仍然是勾股数,所以一般我们想找的是a,b,c互质的勾股数组。 关于这样的数组,比较常用也比较实用的套路有以下两种: (1)当a为大于1的奇数2n+1时,b=2n^2+2n, c=2n^2+2n+1。 实际上就是把a的平方数拆成两个连续自然数,例如: n=1时(a,b,c)=(3,4,5) n=2时(a,b,c)=(5,12,13) n=3时(a,b,c)=(7,24,25) … … 这是最经典的一个套路,而且由于两个连续自然数必然互质,所以用这个套路得到的勾股数组全部都是互质的。 (2)当a为大于4的偶数2n时,b=n^2-1, c=n^2+1 也就是把a的一半的平方分别减1和加1,例如: n=3时(a,b,c)=(6,8,10) n=4时(a,b,c)=(8,15,17) n=5时(a,b,c)=(10,24,26) n=6时(a,b,c)=(12,35,37) 关键代码:from hhhaaa_ int main() { int t; scanf("%d",&t); while(t–) { int n,a; scanf("%d%d",&n,&a); if(n>2||n0)printf("-1 -1\n");//费马定理 else if(n1)//特判,输出一组x+yz就好,这里a+1a+1 printf("%d %d\n",1,1+a); else{ int k=a/2; if(a&1)//a为大于1的奇数 printf("%d %d\n",2kk+2k,2kk+2k+1); else //a为大于4的偶数2n printf("%d %d\n",kk-1,kk+1); } } return 0; }
ACM第二讲培训目标:让菜鸟可以上网刷题,自我训练,最终成为老鸟资源:http://acm.hdu.edu.cn/https://www.csdn.net/为什么说数学能力非常重要,见一道实际比赛的水题Problem 1001 A water problem作者:queuelovestackTime Limit: 5000/2500 MS (Java/Others)Memory ...