POJ 1320:Street Numbers
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 2753 | Accepted: 1530 |
Description
Write a program to find pairs of numbers that satisfy this condition. To start your list the first two pairs are: (house number, last number):
6 8 35 49
Input
Output
Sample Input
Sample Output
6 8 35 49
题意是一个计算机程序员住在一个门牌号(从1开始计)连续的街道上,每天晚上她都在这个街道上从头走到尾,有一天晚上她把她走过的门牌号相加起来,下一次她走另一条路还是相加门牌号,令她吃惊的是(我都不知道这有什么好吃惊的),两个和是相等的。让打出表house number,last number
题意的意思翻译过来就是1+2+...+x = x+(x+1)+(x+2)...+y
求x,y。
方程就变为x*(x+1)/2 = (x+y)(y-x+1)/2 => y^2+y-2*x^2=0 => (2*y+1)^2-8*x^2=0
做这道题的收获就是通过这道题了解了佩尔方程,它是一个解x^2-d*y^2=1这类方程的方法。
说起来这个佩尔方程也是逗,是费马老人家提出来的,结果欧拉记错了,写在他的书中了。有意思的是,可能是欧拉的影响力太大了,之后大家还是把费马提出的方法叫佩尔方程了,真替费马感到不值啊(之后再一想想,我有什么资格替费马感到不值。。。人家一个大定理青史留名,我一个程序员还在做POJ的题。。。做得还挺好玩)。
咳咳,反正佩尔方程的意思就是x^2-d*y^2=1的第一个解x0,y0已知的话,其余的值有一个递推公式了:
X(n)=X(n-1)*x0+d*Y(n-1)*y0
Y(n)=X(n-1)*y0+Y(n-1)*x0
知道了这个之后,程序就好写了。以后记住解x^2-d*y^2=1的方程有一个简便算法~
代码:
#include<iostream> #include<iomanip> #pragma warning(disable:4996) using namespace std; int main() { //freopen("input.txt","r",stdin); //freopen("out.txt","w",stdout); long long i,x0=3,y0=1,last_x=3,last_y=1,x,y; for(i=1;i<=10;i++) { x=last_x*x0+8*last_y*y0; y=last_x*y0+last_y*x0; cout<<setw(10)<<y<<setw(10)<<(x-1)/2<<endl; last_x=x; last_y=y; } system("pause"); return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。