英雄能够自由地跨越两个世界,从时间幻象的世界到因果关系的深层世界,再返回来。这是主宰者的能力。它并不会使一个世界的原则污染另一个世界的原则,但可以使头脑借助另一个世界来了解这个世界。
我相信,所有的人都能够拥有这样的能力,只要他们愿意终身学习。
题目来源:. - 力扣(LeetCode)
国庆的股票就像过山车一样精彩,有没有心动啊?今天,虽然是一道算法题,但是算法题讨论的就是这个主题呢。你想设计一个能赚钱的算法吗?
给定一个数组 prices
,它的第 i
个元素 prices[i]
表示一支给定股票第 i
天的价格。
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0
。
这题很有意思,如果深究的话。虽然从金融的视角看,我觉得这题的设置略显稚嫩,但是这题确实给了我一些以前从来没有思考过的启发。
示例 1:
输入:[7,1,5,3,6,4] 输出:5 解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。 注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。
示例 2:
输入:prices = [7,6,4,3,1] 输出:0 解释:在这种情况下, 没有交易完成, 所以最大利润为 0。
提示:
1 <= prices.length <= 105
0 <= prices[i] <= 104
那我们就题解题,开始吧。(注:代码将分步地迭代展示)
class Solution:
def maxProfit(self, prices: List[int]) -> int:
首先,我相信大家都知道如何求最大值。求解最大值的过程其实是一步迭代的过程。受这种思想的启发,我们这题应该也是可以通过逐步的迭代求其解。
容易看出:
从左往右地生成金融时间序列数据
当我们逐渐从左往右生成曲线时,最佳交易策略也一定是逐渐生成的,而且题目要求的最大利润一定会越来越大
所以,让我们从左往右地生成曲线开始,这也是市场生成金融时间序列数据的顺序。
1、最大值的迭代
由于时间序列曲线本质上是离散的(如果是连续的也把它分割成离散的,就像定积分的处理方式),回顾一下最大值是怎么迭代的(比如,求一个数列中前n个最大的值
):
类似地,在第n+1步迭代时得到的最大值一定是在第n步迭代的最大值和某个东西的取大。
class Solution:
def maxProfit(self, prices: List[int]) -> int:
# 以下的for循环可能需要遍历完整,也可能不需要;可能需要的是数据点(即价格),也可能需要的其实是它们的时间序号,也可能两个都需要——为了方便解读,先这么写在这里
for 数据点 in prices:
最大利润 = max(最大利润, 某个东西)
这里面的某个东西一定是新的一种买卖策略(Policy)。注意在本题中有“先买后卖”这种“硬规则”约束,因此我们准备这样的头脑风暴:
只要确定了买和卖,也就是低位和高位,那就可以确定一种基本的交易策略,当然最大利润也就确定了。
事实上还可以再简单一点,本题只要最大利润,但是并不关心是在何时买何时卖的,因此我们可以省略确定策略的步骤,只要找到低点或者高点中的一个,当找到另一个之后,最大利润就确定了
2、最大利润的确定(假如我们找到了算法,我们在这里严谨地证明,这个算法,可以完成这个任务)
我们相信,完成这题,就像打一场游戏,只要打一遍就可以完成(Agent可以线性时间复杂度地求解它)。事实确实如此。本题还有一种思路相对简单但代码更复杂的求解方法,这也是我想到的第一个算法,下面介绍高频交易的时候会详细讲讲这个算法是怎么来的。事实上,还有另一种线性时间复杂度的算法,代码特别特别简单,我们将在这一节里面介绍。但是为了更优雅地求解这个问题,我们需要花一些功夫多想想,精心设计我们的思路。
因为触发了另一个位的同时就能够得到最大利润,因此我们像这样构建变量:
class Solution:
def maxProfit(self, prices: List[int]) -> int:
for 数据点 in prices:
# 修改了以下内容
低位或高位 = 第1个转换器(低位或高位, 某个东西)
最大利润 = max(最大利润, 第2个转换器(低位或高位))
在曲线逐步徐徐展开的过程中,有且仅有以下3种情况发生(我们说,数据是“分步”产生的,其实就是单位时间):
- 新的一步的曲线数据点比原先曲线的最后一步要高
- 新的一步的曲线数据点与原先曲线的最后一步等高
- 新的一步的曲线数据点比原先曲线的最后一步要低
首先,无论是哪种情况发生,因为先买后可卖,所以关于最后一步,如果有交易策略在这一步发生,那么不可以是买入,只可能是卖出。
如果交易策略发生变化了,交易策略一定会告诉交易者在最后一步完成某个交易动作,即卖出。不然,假如买和卖都不在生成数据后的曲线的最后一步执行就能够得到最大利润,根据全局与局部的关系,那么这个新的最大利润也应该是生成数据前的曲线的最大利润,因此这两种交易策略是一样的,矛盾。
归纳一下,就是:
曲线在逐步生成的过程中,交易策略要么不变,要么突然变成最后一步卖出。
结合这个,考虑情况2,交易策略如果发生变化,生成数据后最后一步卖出,其实就相当于生成数据前最后一步卖出,因此交易策略可以没有变化。所以可以使用不变的交易策略应对情况2。
下面说明当遇到情况3时交易策略是一定不会变的。如果变化,生成数据后最后一步动作是卖出。但是事实上,最后一步卖出不如倒数第2步卖出的利润大。这就和生成数据后能获得“最大利润”矛盾了。
所以交易策略如果发生变化,一定是遇到了情况1,因为在情况2或者情况3下,交易策略都可以保持不变。
让我们聚焦这个可能让交易策略发生变化的情况1。
情况1:新的一步的曲线数据点比原先曲线的最后一步要高
如果交易策略变化,明智的动作是在最后一步卖出。但如果交易策略不变,最大利润肯定也不变对吧——那剩下的“第2个转换器(低位或高位)”东西怎么翻都翻不出五指山(很容易验证这个东西是不可能超过最大利润的——如果策略不变,最新的价格-买价 一定是不超过最大利润的;如果策略变化,最新的价格-买价 就是最大利润)呢,那就随意啦!
看来第一个需要我们迭代的东西确定了——买入的低位价格(以下简称“买价”)!
class Solution:
def maxProfit(self, prices: List[int]) -> int:
for 数据点 in prices:
# 修改了以下内容
买价 = 第1个转换器(买价, 某个东西)
最大利润 = max(最大利润, 数据点 - 买价)
太棒了!现在只剩下“某个东西”和“第1个转换器”需要确定了。买价又是如何迭代的呢?
3、买价的确定
只要确定买价,最大利润就确定了。策略不变的时候买价是不变的。所以,让我们继续考虑情况1,并特别考虑策略发生变化的情形。卖价就是最后一步的价格。买价会在这个时候变化吗?会,也可能不会。如果发生变化了,那该怎么变呢?
如果全局只有一步,而买和卖必须在不同的两天,这种情况下最大利润是0。
如果全局至少2步,那么从全局只有1步到全局有2步的曲线生成过程中,有且仅有3种我们之前讨论过的情况。其中只有情况1可能导致交易策略的变化(交易策略变化时买价可能变也可能不变,但交易策略不变买价一定不变),也只有情况1可能会导致买价的变化。
好像一下子看不出来。既然是个数列的递推关系,那看看能不能对步数用归纳法(你知道的,我们始终要关注情况1)。
看看全局有2步的情况。我们知道,交易策略与数值具体是多少无关,只与曲线内部数据点之间的高低关系有关。这个时候,低价就是最小的价格,左下角的,第一步的数据点。
看看全局有3步的情况。
prices = [1, 2, 3],低位是价格为1的点,即第1个点
prices = [2, 2, 3],低位是价格为2的点,即第1个点
prices = [3, 2, 3],低位是价格为2的点,即第2个点
好像都是局部最小值诶!那是不是真的就是这样的嘞?
class Solution:
def maxProfit(self, prices: List[int]) -> int:
for 数据点 in prices:
# 修改了以下内容
买价 = min(买价, 数据点)
最大利润 = max(最大利润, 数据点 - 买价)
class Solution:
def maxProfit(self, prices: List[int]) -> int:
买价 = prices[0]
最大利润 = 0
for 数据点 in prices:
买价 = min(买价, 数据点)
最大利润 = max(最大利润, 数据点 - 买价)
return 最大利润
确实,那么用数学归纳法应该能够证明这个买价一直就是这个局部最小值(容易看出递推式“买价 = min(买价, 数据点)”算出来的买价序列就是局部最小值)。
定理:在情况1成立时,展开中的时间序列曲线的最小值序列是买价序列。
证明了这个定理,就是证明了Solution算法为什么算出来的就是最大利润。记时间序列曲线的步数为n。我们已经验证了n=2,n=3的时候是成立的。
假设n=k(k>=2)的时候是成立的,下面证明n=k+1也是成立的。
因为在n=k的时候,展开中的时间序列曲线的最小值序列是买价序列,那么n=k+1时,由情况1的定义(新的一步的曲线数据点比原先曲线的最后一步要高),新的时间序列曲线的最小值就是原来的最小值。它就是买价吗?如果新的交易策略仍然只发生在前面,好说,那么交易策略可以不变,买价不变,此时定理成立。如果交易策略有发生后面,那么,买价不可能发生在最后一步,只能够在前面,即最后一步是卖出。这个时候,在最小值的时候购买,那岂不是赚翻了?这样,这个定理就证明完了。
4、一些更高层次的总结与回顾
事实上,我第一次做的时候不是这么想的:我是真的把这个问题当成了一种数据科学问题。
class LN():
def __init__(self, v=None, n=None):
self.v = v
self.n = n
class Solution:
def maxProfit(self, prices: List[int]) -> int:
active = False
maxs = 0
mins = []
_ = len(prices)
pr = None
head = None
for i in prices[::-1]:
new_node = LN(i)
new_node.n = head
head = new_node
prices = head
av = prices.v
while _>1 and av==prices.n.v:
prices=prices.n
_ -= 1
if _>1 and av<prices.n.v:
maxs = prices.n.v-av
mins.append(av)
if prices.n!=None and prices.n.n!=None:
active = True
pr = prices.v
prices=prices.n
while prices.n!=None and prices.n.n!=None:
av = prices.v
while av==prices.n.v and prices.n!=None and prices.n.n!=None:
prices = prices.n
_ -= 1
nt = prices.n.v
if av<pr and av<nt:
mins.append(av)
elif av>pr and av>nt:
m = max(map(lambda x: av-x, mins))
if mins!=[] and maxs<m:
maxs = m
pr = av
prices = prices.n
active = True
if prices.n!=None:
av = prices.v
nt = prices.n.v
if av==nt:
return maxs
else:
if active:
if av>pr and av>nt:
m = max(map(lambda x: av-x, mins))
if mins!=[] and maxs<m:
maxs = m
elif av<pr and av<nt:
mins.append(av)
if mins!=[] and av<nt:
m = max(map(lambda x: nt-x, mins))
if maxs<m:
maxs = m
return maxs
虽然这个算法的结果是这样的:
超出时间限制
201 / 212 个通过的测试用例
我知道我的算法算出来的答案是对的,只是时间复杂度的问题。所以,我愿意多花一些时间对比一下这种算法与先前的算法采用的不同思想。
不妨看看,让我生不如死、百思难得其解、冥思苦想许久的案例究竟是何方神圣:
prices = [414,863,393,674,205,793,229,379,37,455,594,36,312,667,441,411,514,344,681,359,865,124,984,670,509,337,495,266,275,356,26,229,51,557,292,975,551,985,445,710,467,31,890,694,127,349,631,322,595,59,433,173,944,305,662,379,864,835,355,411,506,10,716,918,872,716,887,453,706,416,245,611,6,403,894,94,852,733,890,131,481,723,571,335,695,475,112,245,389,754,439,990,771,282,935,746,422,627,570,101,212,248,123,633,842,110,272,352,910,926,726,502,396,49,444,581,504,145,765,710,785,126,232,386,245,613,43,591,638,179,438,838,5,486,170,960,273,347,8,176,884,569,528,442,839,573,953,102,802,659,51,675,110,76,531,783,539,806,363,333,214,919,473,303,690,917,793,2,504,7,584,734,527,561,484,648,622,123,655,977,235,999,714,963,921,801,237,752,127,484,772,483,62,544,938,845,218,32,832,174,561,635,44,903,972,550,291,12,234,24,750,182,257,265,276,926,409,865,170,587,35,813,628,991,829,573,226,69,979,188,285,582,276,951,114,634,797,720,306,365,862,416,8,174,446,555,132,578,152,582,214,673,156,899,613,871,789,378,434,464,532,356,884,83,744,126,773,537,149,723,653,967,574,87,463,312,416,3,667,339,471,237,540,860,709,867,474,769,344,52,633,784,199,239,735,362,131,14,376,683,532,154,618,505,773,970,207,208,926,192,273,338,282,874,679,932,67,593,412,932,807,456,637,360,988,839,345,890,409,316,535,123,234,480,368,515,98,486,343,79,989,768,443,943,628,184,452,379,557,265,904,327,353,698,158,148,133,972,179,934,90,976,199,187,142,126,55,764,64,593,310,284,307,43,855,51,382,483,251,601,675,723,467,501,217,896,433,759,156,979,954,802,308,591,637,920,867,411,82,433,320,548,571,254,771,597,761,93,106,163,662,500,764,587,801,876,338,431,771,824,219,446,344,311,532,833,921,616,536,645,292,256,764,560,885,434,640,97,926,150,755,562,636,768,713,710,256,64,293,390,223,509,614,457,182,881,646,743,700,995,94,801,173,579,104,107,557,736,292,483,66,767,781,151,592,169,482,775,608,398,399,38,548,185,720,226,832,54,463,57,36,97,416,611,663,357,586,286,744,535,671,202,26,443,613,739,213,672,409,534,62,697,985,920,809,473,48,895,920,871,527,121,339,195,511,80,940,647,530,418,344,139,53,593,638,961,183,392,208,312,522,448,844,182,358,589,152,575,600,715,33,457,865,20,565,508,101,670,407,123,154,977,498,495,736,791,883,896,793,923,409,370,524,748,926,682,800,481,858,388,475,847,775,326,707,792,22,807,60,65,118,10,323,410,326,340,803,386,557,633,188,309,589,981,616,71,516,950,313,781,458,488,314,535,114,197,53,626,541,38,537,770,311,444,797,703,216,944,879,42,863,239,350,469,207,709,79,319,254,514,626,675,877,117,490,870,709,779,974,240,176,461,478,278,800,561,526,663,221,989,498,848,128,367,606,554,945,54,968,314,244,437,388,584,490,977,282,316,598,106,883,275,426,335,969,809,697,595,814,237,379,136,585,742,516,492,476,646,372,423,857,1,763,733,437,420,720,181,149,439,125,512,910,621,890,422,84,622,680,736,686,941,786,288,179,152,900,773,295,602,319,979,933,533,574,559,392,413,122,383,410,754,735,793,622,152,403,429,397,315,905,186,209,408,212,711,996,315,706,835,8,887,235,406,314,5,942,894,440,371,398,257,233,628,807,901,370,287,62,799,261,635,991,417,746,442,153,676,566,231,716,927,458,489,113,757,592,170,540,717,441,697,887,403,988,468,132,809,705,480,335,744,317,742,139,861,20,161,693,474,342,939,683,796,49,263,62,225,968,624,223,724,55,964,821,242,916,149,733,872,24,442,360,252,693,813,567,672,181,173,76,646,286,660,50,613,445,296,821,30,729,632,491,849,954,188,216,257,104,168,275,650,707,448,513,463,908,198,272,655,258,758,793,204,45,352,488,791,361,963,626,980,337,594,259,215,338,670,332,211,430,406,875,839,474,878,181,890,753,923,160,872,227,348,123,48,677,365,56,901,179,41,822,724,188,184,746,617,84,714,575,94,242,980,665,336,175,67,676,51,498,787,861,414,329,979,596,743,685,546,19,906,536,747,618,41,106,632,709,922,495,947,720,254,95,422,292,758,73,58,880,393,330,783,732,103,400,592,970,245,34,83,468,935,805,514,113,404,26,237,995,143,269,737,213,595,770,405,203,64,904,501,132,347,983,418,974,242,883,945,597,88,245,612,352,714,419,983,157,627,688,950,469,59,510,921,422,438,495,907,452,501,394,79,45,186,359,97,181,830,542,428,520,801,275,137,753,665,403,116,653,299,500,851,913,801,659,483,23,188,550,605,728,985,962,521,946,351,741,559,217,487,411,863,140,257,540,689,603,117,328,997,149,171,456,233,474,709,903,563,525,771,656,692,556,744,331,742,947,758,663,648,604,347,417,477,524,788,231,771,40,406,830,758,307,747,583,985,102,681,76,331,822,938,307,457,631,442,584,830,494,707,775,528,483,112,226,585,779,986,28,246,448,833,550,629,460,334,6,149,236,191,523,259,697,958,288,634,512,314,788,30,376,313,305,706,882,222,703,946,555,233,69,189,498,237,180,663,19,717,998,881,615,47,512,826,488,631,504,542,264,182,771,633,355,493,223,330,113,417,756,588,712,359,265,842,701,757,835,959,254,983,914,462,356,602,876,513,972,19,566,635,884,446,115,91,545,878,381,262,75,975,674,491,138,360,69,236,207,935,911,770,747,151,686,322,972,315,834,984,186,793,942,942,907,849,956,79,546,226,176,164,687,776,546,863,661,397,735,221,495,984,45,458,218,834,239,857,81,599,482,481,21,471,175,925,719,607,724,365,621,64,644,200,718,574,954,528,285,683,898,665,266,315,416,318,325,306,75,988,907,913,619,1,447,366,412,451,797,540,748,290,401,996,312,832,26,885,491,685,555,512,829,999,743,376,835,824,207,341,609,408,597,275,741,225,967,331,839,243,696,337,71,610,200,455,572,115,800,707,172,79,211,721,844,360,306,874,498,831,623,693,684,898,0,271,732,678,487,367,639,574,327,276,887,165,580,460,292,837,667,335,431,116,970,660,132,367,411,205,694,434,526,845,646,791,663,583,55,437,400,481,531,813,333,509,812,970,426,161,711,231,216,70,266,560,4,794,850,66,956,414,18,720,655,257,341,546,449,943,273,552,787,878,764,219,492,164,78,417,758,449,577,937,837,490,750,234,970,18,503,668,769,720,56,902,407,995,559,256,454,454,276,128,863,666,48,488,506,204,555,927,207,497,506,872,401,520,504,432,30,42,160,211,6,392,356,393,581,640,996,636,462,927,387,121,510,102,7,98,399,911,148,354,13,289,858,354,250,661,845,507,715,811,607,949,880,942,281,750,250,805,823,130,297,746,707,381,814,404,902,614,977,620,181,851,614,44,442,382,347,104,259,632,612,423,63,449,917,369,816,592,587,659,95,805,953,813,151,224,967,423,531,713,191,522,899,862,408,443,422,871,373,389,663,353,311,141,886,696,863,755,987,177,910,882,303,188,95,870,450,867,822,675,543,939,813,388,614,582,754,847,46,484,569,203,399,377,225,453,571,912,847,395,522,596,321,790,956,385,406,994,453,566,63,295,565,919,156,857,234,125,62,777,778,438,220,476,180,887,731,106,912,551,584,922,36,932,290,527,694,921,920,422,316,461,348,495,271,992,542,70,428,205,628,964,784,457,915,811,94,564,724,2,32,495,455,749,890,642,603,214,181,18,100,272,217,440,799,585,129,810,982,60,650,579,182,219,644,456,587,252,837,57,596,113,708,903,112,243,731,243,316,975,133,226,114,927,981,257,897,982,164,546,830,976,477,247,896,108,798,371,162,378,436,570,891,597,311,519,649,564,540,264,529,875,322,412,108,937,996,785,805,367,864,10,532,337,72,718,705,458,408,402,794,825,106,577,537,937,833,856,499,392,414,860,273,13,386,776,873,147,756,308,479,704,211,835,896,100,831,938,717,876,351,339,52,150,766,954,919,708,204,348,403,436,743,620,941,459,744,648,313,902,772,786,253,503,830,390,65,358,889,234,758,669,966,897,398,401,295,157,345,326,486,221,91,998,204,72,267,880,661,989,194,243,64,520,11,974,889,361,73,107,977,296,655,734,848,565,174,968,461,433,132,264,777,169,630,711,37,495,802,343,85,643,432,773,951,768,19,817,679,317,117,700,469,66,366,185,571,998,865,669,744,113,782,561,922,959,915,886,94,518,516,906,71,726,48,615,794,185,58,47,509,568,700,699,538,137,972,449,502,139,268,88,646,636,279,269,61,652,358,436,261,318,37,519,671,841,707,13,475,588,489,76,514,994,283,530,830,554,508,666,345,574,750,76,640,553,665,358,741,155,890,14,1,19,541,384,377,462,150,510,340,465,208,824,450,845,198,970,446,574,624,134,692,970,95,63,915,35,586,910,176,156,32,785,937,652,256,539,941,568,287,4,407,105,781,498,697,823,972,195,149,639,897,417,442,72,855,221,858,616,207,553,325,403,272,497,87,447,9,155,98,207,538,918,505,933,119,417,915,820,301,850,226,573,583,39,952,225,971,459,205,232,446,462,496,15,942,869,756,36,230,674,990,59,671,507,252,464,713,699,746,609,6,922,131,663,57,116,715,496,551,410,299,468,69,472,463,372,93,399,195,399,431,487,664,712,769,949,580,794,59,104,530,761,108,575,833,123,552,22,649,869,643,495,40,692,678,578,958,541,389,61,142,86,818,248,681,451,246,881,767,613,389,970,263,705,496,467,217,72,915,577,599,679,897,440,749,44,461,205,826,959,846,498,854,114,324,861,385,617,293,645,56,665,184,148,333,461,444,407,342,12,673,852,917,470,217,166,254,879,488,770,452,774,28,659,791,542,527,36,760,192,595,837,820,210,785,19,620,432,430,803,300,207,863,930,633,760,644,228,928,210,564,792,276,603,722,610,862,301,434,188,794,955,237,761,550,840,28,919,720,743,377,69,534,412,994,206,221,986,974,980,246,842,72,144,935,745,687,769,37,73,987,913,312,326,221,498,713,670,658,472,622,286,754,751,459,911,701,644,146,558,862,295,258,505,214,659,185,596,904,608,815,38,296,311,70,379,396,917,435,619,581,633,18,524,916,227,767,599,454,648,89,407,793,388,333,428,897,273,157,882,418,304,574,151,34,611,505,768,494,88,55,67,945,155,768,107,204,741,4,516,435,984,253,7,277,501,237,41,778,277,701,574,918,838,11,377,640,525,496,233,694,30,528,606,899,515,615,916,834,750,405,355,673,789,425,93,538,756,817,63,922,817,440,493,960,471,389,140,749,547,546,539,395,343,927,356,270,117,260,784,829,870,908,564,133,900,956,903,544,157,920,972,108,778,44,738,334,192,212,409,919,711,735,3,529,23,787,302,648,732,687,459,937,655,342,350,76,268,934,842,34,584,903,794,439,865,428,54,730,537,467,568,137,179,218,97,467,804,997,655,708,822,518,552,190,182,394,145,33,851,227,69,743,52,388,845,921,658,591,404,482,10,792,991,559,665,86,363,918,925,410,245,334,677,508,468,182,813,723,707,264,255,951,74,683,849,793,826,210,840,606,455,463,465,537,178,74,561,955,599,606,96,18,279,162,236,382,576,196,970,780,708,253,194,882,223,124,662,305,982,513,164,328,304,89,532,389,50,451,41,585,64,632,86,635,67,252,930,719,544,350,954,369,245,509,830,377,315,548,597,317,761,900,86,679,342,360,872,752,345,450,286,705,182,373,485,438,21,319,549,662,354,901,985,47,960,102,649,724,873,175,700,19,360,45,214,587,426,816,784,283,372,630,222,357,53,620,255,515,582,736,449,735,315,381,422,456,13,390,433,944,288,870,239,27,550,422,288,570,800,730,24,320,834,845,10,741,9,454,221,480,18,151,6,653,168,108,159,536,182,951,710,553,221,634,257,200,862,782,932,852,838,751,557,120,663,55,395,700,363,132,581,714,925,397,514,905,253,896,637,142,641,107,195,390,764,880,983,171,392,281,571,879,612,858,480,476,307,145,138,306,180,165,197,46,886,397,231,682,658,841,179,456,72,469,438,871,933,316,916,793,5,662,478,806,784,468,559,562,721,331,842,934,606,392,751,54,357,750,543,883,841,530,97,390,372,30,780,360,541,882,867,613,683,736,548,343,88,232,40,327,734,894,366,871,281,391,963,736,992,634,527,492,114,829,80,319,392,293,120,127,640,141,794,526,479,16,636,381,354,245,203,510,115,679,234,277,681,281,89,270,905,443,298,857,655,25,907,351,78,953,816,865,488,166,639,592,946,350,483,934,798,835,250,16,732,940,970,680,442,308,899,169,561,469,479,838,21,831,658,93,954,560,371,906,692,942,643,643,104,842,252,245,967,137,693,918,437,297,399,771,78,179,861,494,900,172,350,28,237,30,217,840,496,486,271,903,355,963,43,798,376,79,943,399,849,842,756,669,322,362,341,99,749,108,216,66,208,517,503,89,522,737,228,896,128,322,892,7,544,411,161,553,596,637,98,642,87,763,257,974,420,67,377,901,231,903,220,601,640,769,58,46,174,123,492,292,818,454,288,866,697,324,996,766,514,775,38,506,837,90,185,988,148,804,690,166,696,513,317,886,807,359,554,696,6,34,284,508,80,278,492,54,927,353,738,928,429,825,27,58,34,760,879,662,210,998,160,280,957,459,645,396,260,547,412,805,62,526,814,395,977,719,406,560,253,421,803,155,150,537,335,716,602,104,323,261,807,201,612,664,421,449,571,641,413,87,952,349,218,943,848,414,641,929,758,302,221,401,586,374,634,139,463,848,755,160,749,327,580,779,961,439,888,74,411,907,666,105,748,423,309,445,57,602,985,653,428,739,574,455,843,48,29,93,20,474,111,9,278,668,639,423,455,508,342,471,749,793,657,122,519,380,65,520,317,975,221,896,622,374,579,385,908,428,665,96,222,431,92,400,991,59,163,165,957,885,89,195,956,774,886,939,31,985,684,859,157,740,763,210,402,716,737,191,936,762,97,601,238,178,779,462,990,459,749,837,264,796,64,63,634,794,481,380,225,199,330,313,333,827,525,622,584,651,146,941,468,505,913,882,79,744,210,628,841,888,487,972,446,768,505,501,562,507,782,220,269,12,94,927,817,989,463,730,217,919,782,954,401,488,331,672,45,497,183,269,742,44,64,591,737,17,721,319,192,167,191,51,7,698,285,748,370,996,825,432,888,672,908,767,574,101,694,225,988,230,656,930,754,575,926,641,481,798,849,884,972,724,956,455,930,287,32,268,952,8,262,951,64,226,904,941,733,508,540,766,763,589,933,955,724,473,884,987,694,926,730,658,468,637,111,360,614,224,426,825,111,998,756,994,685,229,173,233,259,378,807,89,727,765,789,936,547,994,758,255,27,675,550,525,59,124,658,764,701,674,370,420,643,847,966,452,555,313,219,361,195,548,441,823,601,632,649,872,891,926,579,802,292,332,847,328,142,601,850,951,235,39,8,107,4,523,797,171,744,252,886,811,361,937,294,636,685,327,436,407,231,440,508,261,798,101,370,17,247,724,317,969,463,450,505,521,252,436,946,945,409,533,234,704,732,756,844,234,180,704,544,742,571,183,969,168,314,149,152,872,912,545,511,188,223,839,574,55,208,83,907,284,407,500,699,249,935,861,952,450,130,241,102,632,887,789,992,749,645,674,202,231,248,711,484,108,594,792,714,702,714,136,23,742,346,71,59,280,350,982,714,548,265,914,656,314,117,133,759,679,221,307,172,691,157,212,430,620,914,23,554,937,675,601,676,191,987,109,667,880,190,837,638,879,467,793,586,705,238,894,931,821,991,212,251,215,701,853,805,350,511,268,863,271,920,921,903,713,641,287,256,152,189,26,253,848,757,634,225,498,680,86,573,679,4,723,95,680,703,183,171,108,472,803,998,881,934,160,112,344,416,493,374,544,138,767,360,20,565,372,158,365,511,428,83,803,498,987,228,949,785,658,214,132,781,934,744,67,597,407,68,194,306,283,180,775,549,845,411,31,328,852,12,110,964,7,33,533,141,482,904,121,912,896,521,586,965,382,329,808,912,901,525,577,462,310,266,221,59,755,436,453,952,586,8,376,298,404,76,423,638,911,498,942,44,522,136,304,636,190,237,801,398,459,692,100,843,17,224,677,153,369,994,56,3,404,35,964,56,130,397,363,996,510,998,341,109,611,877,983,500,554,519,78,312,585,9,663,574,485,198,226,982,491,394,418,942,389,123,534,254,302,984,555,956,764,22,526,47,330,288,156,855,227,629,583,303,761,869,490,573,630,474,418,377,501,550,173,466,147,653,938,941,525,320,998,804,973,887,688,17,837,315,631,494,594,745,162,47,228,81,572,482,523,579,803,761,716,375,783,579,588,654,243,422,776,336,478,600,201,807,227,17,286,259,467,490,488,863,298,724,645,628,146,867,267,411,445,565,380,296,365,925,562,54,859,333,999,475,305,163,430,565,355,913,745,855,278,404,714,579,717,768,425,213,821,114,314,514,381,293,999,220,885,339,992,811,296,453,544,296,232,152,901,469,698,932,909,463,333,964,497,436,429,948,621,978,599,512,953,183,83,902,8,624,724,769,145,797,447,877,76,80,134,956,634,561,174,374,807,210,813,383,627,244,265,711,637,697,407,342,250,760,182,583,185,787,436,731,74,356,756,139,841,246,900,921,171,548,562,88,60,839,515,686,410,595,624,502,969,252,656,655,653,498,355,714,341,105,773,701,927,418,467,160,787,677,617,861,505,680,669,58,696,192,476,245,466,161,823,591,939,405,508,4,95,503,914,827,728,647,805,961,223,896,663,738,177,186,949,145,893,935,116,862,398,588,867,434,983,587,369,866,366,561,169,595,875,968,712,207,386,593,588,930,319,187,195,186,334,707,690,487,146,89,601,962,510,84,266,917,333,34,231,802,715,562,82,652,453,750,352,487,850,799,666,261,69,639,224,465,888,308,827,436,828,604,103,13,994,832,850,361,635,250,187,725,966,18,758,378,489,310,581,117,619,242,800,10,731,288,146,587,63,16,221,861,318,12,422,996,563,379,292,838,714,852,479,101,642,16,728,441,290,312,285,863,914,848,449,511,78,722,330,20,588,462,13,135,113,543,475,502,158,144,16,801,934,380,806,366,263,86,658,299,971,422,359,594,611,282,663,70,455,161,336,861,2,181,361,227,672,48,215,207,429,896,384,490,952,112,575,16,685,371,744,309,469,948,899,546,963,11,123,24,291,506,359,252,489,840,395,768,678,504,510,443,5,569,106,932,555,926,892,716,993,148,108,468,132,626,591,977,106,467,78,627,233,654,971,678,813,19,726,635,294,894,680,146,486,806,917,139,969,415,839,103,997,185,858,882,642,510,148,946,775,978,972,470,578,787,895,143,745,124,411,411,303,829,728,734,254,432,123,467,605,522,231,412,889,523,419,307,317,828,30,398,391,620,440,635,753,187,604,837,789,856,819,153,498,680,122,977,69,480,70,76,620,583,859,300,12,215,446,892,802,855,390,692,620,886,772,850,140,177,789,17,449,441,505,324,151,105,929,976,246,255,313,600,445,911,230,907,398,862,701,672,886,402,167,797,722,58,707,912,993,900,646,881,558,990,872,332,959,614,146,761,612,574,240,169,970,472,609,932,508,634,839,462,359,772,659,773,155,120,936,765,103,470,121,711,971,922,296,753,170,921,308,44,386,870,413,693,901,508,447,812,117,545,211,114,110,299,413,700,877,401,362,932,211,449,982,377,304,394,352,25,838,486,358,266,799,389,498,603,228,445,5,596,731,284,619,605,917,441,946,627,924,531,939,270,661,139,86,284,963,40,775,589,577,870,875,409,768,349,868,15,664,958,320,278,99,401,999,514,594,555,300,262,900,327,493,535,426,595,299,22,128,921,373,935,669,107,209,948,769,276,439,655,314,330,896,964,965,616,626,214,872,761,442,805,86,149,169,921,327,898,244,285,312,696,466,880,443,143,830,937,977,323,346,345,580,532,210,610,210,185,351,130,685,337,46,380,514,986,976,173,739,76,4,35,315,548,294,627,391,607,439,491,724,678,742,424,999,325,540,526,874,99,797,449,713,366,144,207,176,838,736,653,238,918,485,316,498,516,480,881,630,41,863,41,81,188,864,59,937,462,748,48,670,24,713,195,58,967,163,33,688,769,825,924,787,278,929,351,439,104,6,349,97,340,121,943,161,290,845,553,758,179,598,658,486,859,9,781,942,678,663,217,104,382,227,312,605,569,617,0,140,560,856,52,72,721,897,880,886,128,588,742,611,809,946,24,207,476,779,235,868,99,427,412,62,34,971,918,982,446,25,4,536,653,382,677,443,968,372,53,291,178,385,220,437,570,295,217,787,580,896,249,57,178,161,740,658,113,512,510,555,759,271,71,369,196,49,694,318,441,677,806,199,529,118,196,874,77,830,109,796,148,941,481,360,69,579,720,916,154,105,474,825,147,734,861,662,371,794,658,474,660,494,669,319,849,489,720,964,300,283,184,0,393,661,669,222,235,847,113,420,395,875,68,256,621,78,952,78,757,359,922,389,10,188,574,202,971,521,917,718,545,866,58,813,183,454,419,286,707,686,906,383,514,644,946,486,951,330,40,694,166,958,656,292,2,865,301,426,950,415,97,713,609,961,737,653,474,725,220,967,573,467,64,262,413,768,378,591,240,629,476,882,84,523,968,74,735,979,61,854,263,887,402,75,385,961,364,753,944,829,517,412,447,146,273,124,482,140,812,632,10,937,893,122,310,91,976,381,223,730,225,867,528,765,273,64,680,70,261,446,86,339,789,571,703,655,624,974,665,170,66,722,734,681,980,779,29,576,43,158,269,456,485,332,447,451,207,211,684,225,735,395,372,446,156,543,765,886,126,462,785,712,464,630,704,42,431,725,599,420,96,736,564,39,496,976,646,883,565,499,236,474,456,229,730,483,498,866,669,750,253,980,352,284,854,582,317,394,357,594,70,113,34,501,822,874,506,319,351,332,986,626,789,449,483,201,30,515,140,484,292,634,718,667,174,4,297,335,686,920,182,639,240,317,351,856,497,605,409,123,749,245,806,678,246,303,461,226,25,965,685,667,349,585,74,233,128,174,791,608,302,310,457,829,412,66,975,774,853,971,791,290,816,563,203,307,528,334,671,95,841,111,66,272,223,328,893,352,663,117,799,174,267,720,622,523,278,599,209,918,699,624,29,455,576,283,568,808,230,500,539,983,306,277,150,102,10,264,605,292,935,15,294,550,212,823,125,634,760,233,469,393,256,302,803,634,642,763,661,605,122,507,765,527,508,413,532,86,501,103,895,479,589,537,140,551,919,792,107,522,458,305,606,928,688,693,416,732,578,217,606,153,239,436,388,257,350,591,524,849,427,701,43,208,768,606,434,315,579,83,616,711,316,538,44,211,785,668,696,72,842,362,104,860,476,380,526,783,50,455,296,805,801,615,198,15,348,453,813,865,225,137,617,38,94,750,942,77,57,820,721,393,484,850,331,28,100,408,60,275,791,5,946,319,175,578,654,655,474,188,231,736,603,431,390,397,465,346,196,802,646,663,427,462,107,599,735,711,197,349,135,170,84,813,579,130,498,933,322,815,120,192,76,866,908,112,139,39,404,416,579,501,728,204,436,860,613,710,826,826,737,956,411,804,873,407,739,664,821,791,595,139,820,578,965,889,494,105,688,741,289,52,737,135,35,816,835,164,927,372,361,364,140,940,585,788,118,834,92,766,624,877,767,418,147,183,846,99,882,97,125,45,164,48,826,545,97,811,714,583,150,106,796,416,92,734,986,969,893,545,659,800,610,619,32,805,382,541,512,848,435,647,858,453,454,985,944,866,135,151,730,164,548,201,134,819,362,225,950,733,251,816,902,652,950,363,688,866,277,126,322,806,934,432,995,704,156,14,215,442,414,540,802,197,139,765,912,327,739,730,972,637,593,44,831,394,611,828,423,666,303,623,274,54,987,286,729,826,183,413,575,458,179,113,67,619,826,682,862,234,774,268,980,263,111,315,925,980,983,620,434,592,33,998,221,462,360,610,633,12,211,813,578,639,894,207,224,575,889,556,209,586,752,530,2,983,589,373,650,649,354,536,875,477,733,855,263,189,605,481,267,829,439,208,31,307,824,279,937,180,790,360,867,726,490,327,455,272,798,961,875,532,145,886,795,680,285,449,298,192,71,236,528,574,137,100,241,282,250,179,835,887,139,841,197,966,374,48,964,398,441,314,123,473,474,565,343,247,851,325,53,883,12,27,854,497,486,736,434,369,466,911,311,940,421,483,825,438,40,357,468,433,760,213,858,756,383,598,654,599,336,148,323,431,697,985,821,637,208,602,490,890,731,554,304,407,273,459,260,741,510,818,33,11,953,177,459,397,409,321,32,742,958,763,804,394,907,218,944,534,440,672,591,949,370,576,967,66,829,322,489,939,124,82,597,912,300,367,430,462,633,627,162,991,897,398,901,242,0,181,314,7,764,302,652,14,641,318,276,849,911,492,523,855,456,758,53,312,936,980,777,344,614,859,560,250,612,989,496,578,264,966,491,666,576,932,492,599,218,57,959,101,857,253,760,603,126,199,607,47,408,383,574,389,730,34,43,910,18,539,793,454,646,537,69,793,572,375,113,18,893,951,294,115,96,838,921,830,361,684,93,972,525,498,26,32,168,978,368,706,5,534,881,350,736,634,897,738,140,966,837,228,684,791,636,604,59,901,564,357,580,383,301,422,199,75,278,671,506,535,44,857,529,425,835,919,446,746,290,40,47,475,523,521,514,569,687,519,326,638,366,51,593,768,573,229,181,203,260,977,289,124,56,255,18,160,573,786,536,441,638,114,584,566,481,914,804,742,558,810,560,317,969,190,943,146,95,186,62,716,322,74,236,676,158,127,112,170,791,578,67,442,938,224,830,894,238,79,72,796,469,224,484,869,352,219,763,194,340,81,149,527,328,819,558,11,11,670,440,797,701,137,532,819,73,271,920,150,848,390,999,657,19,253,433,207,133,663,806,993,743,933,689,989,656,876,955,307,580,44,931,646,52,82,168,426,874,373,425,426,408,54,107,648,39,115,458,305,162,871,758,52,898,482,536,720,830,559,532,77,339,225,872,498,830,270,772,796,383,259,712,872,305,80,806,454,43,889,303,487,189,114,37,87,215,374,441,263,674,612,120,252,764,887,668,967,174,804,570,327,192,368,813,235,287,876,878,811,636,263,908,17,761,833,688,859,347,732,148,893,417,474,235,901,193,505,74,552,807,810,778,615,290,495,201,399,816,277,792,865,304,718,86,537,335,920,698,492,375,916,478,532,727,495,58,838,589,40,914,991,755,590,473,657,178,729,680,32,978,466,645,884,567,741,391,180,556,817,771,265,125,163,589,745,942,250,195,91,369,26,314,81,762,212,600,966,378,577,851,958,993,728,684,769,683,316,327,331,689,988,482,695,866,368,975,514,543,647,872,24,553,528,435,604,811,296,412,110,876,886,878,458,558,340,139,25,950,567,319,457,316,181,762,347,120,852,526,93,195,976,906,594,890,827,3,3,719,474,689,990,726,933,924,352,885,780,379,292,51,206,357,809,154,521,272,16,29,48,944,508,291,478,701,933,449,900,739,84,627,636,329,731,994,520,851,463,961,985,569,1,548,459,191,861,788,342,65,998,569,476,277,552,690,221,431,887,71,609,23,927,577,190,491,447,871,102,338,530,551,33,951,395,750,986,651,575,354,729,78,802,256,703,832,964,112,488,243,263,921,74,809,245,405,888,807,538,613,672,57,877,686,548,246,14,585,831,314,267,629,880,107,484,669,440,450,821,949,983,955,744,824,789,456,868,170,427,725,894,274,224,97,606,56,555,257,199,410,864,263,107,295,840,209,282,971,78,522,165,702,795,729,727,963,598,761,54,103,444,839,192,982,177,430,209,275,33,710,417,415,988,541,478,405,808,456,335,442,912,88,521,380,489,376,680,159,102,818,294,872,819,72,781,680,553,524,30,603,13,344,832,561,640,947,274,757,198,444,346,112,868,230,411,896,158,98,426,322,757,502,543,224,112,831,21,617,458,957,682,247,858,718,677,527,365,588,224,57,87,613,923,159,936,58,384,557,163,776,383,583,168,143,547,134,474,945,588,861,364,213,327,765,577,161,673,581,56,340,22,806,938,999,402,290,177,567,564,593,991,511,509,952,823,744,296,439,278,326,402,973,980,462,389,416,693,657,658,496,443,694,769,552,62,664,746,976,376,460,84,145,616,651,404,790,635,644,157,660,614,354,347,461,599,370,836,15,660,927,248,515,831,677,469,236,811,584,805,533,885,773,149,883,820,438,865,347,78,431,701,354,467,886,62,493,221,203,530,546,460,212,671,169,777,841,409,222,401,629,81,97,609,723,295,471,919,921,481,151,668,944,50,901,247,546,44,318,321,56,195,845,558,327,80,997,289,837,175,378,737,511,449,174,988,440,262,666,583,942,692,303,703,244,210,137,866,129,511,947,180,8,545,851,339,643,316,797,634,302,840,178,478,248,682,115,467,385,718,112,624,624,580,851,830,886,2,935,419,479,186,307,861,410,7,673,919,224,936,590,892,489,172,637,256,714,851,311,839,45,943,958,227,344,527,810,437,277,503,758,323,905,175,119,960,860,481,598,996,188,480,184,291,212,438,449,885,85,603,786,488,296,22,55,608,678,309,343,763,180,569,44,651,957,555,698,973,470,848,193,705,244,202,754,65,133,165,65,793,403,316,667,91,714,952,875,985,445,59,484,300,792,396,217,626,578,515,892,621,581,829,140,868,365,276,322,376,494,507,272,952,950,43,877,239,520,307,269,817,917,652,108,410,178,343,223,201,622,328,876,59,826,216,586,557,8,420,804,325,966,359,223,836,836,368,621,173,502,959,264,979,365,842,320,248,101,695,624,363,990,30,134,788,916,592,489,200,82,922,205,539,610,7,462,324,55,186,462,875,156,436,288,159,873,244,21,266,715,787,449,790,539,451,541,274,407,488,813,164,302,246,59,293,951,624,675,338,77,24,524,84,245,688,374,860,672,588,507,581,221,895,19,738,12,96,393,558,497,545,596,546,323,690,118,983,93,319,172,632,54,643,892,783,9,524,101,112,112,754,124,850,594,506,444,556,583,222,693,403,132,100,495,661,776,645,217,531,293,884,660,528,761,714,339,986,650,220,937,509,201,945,500,3,505,423,779,983,837,322,971,104,12,872,529,381,799,492,580,408,765,39,506,372,463,134,329,818,274,888,441,388,318,607,92,592,96,742,834,433,951,587,408,870,159,789,656,266,348,863,159,70,574,343,19,436,850,908,483,537,244,997,233,447,373,428,621,411,718,802,49,16,215,877,650,756,112,549,12,454,378,274,699,891,136,792,183,634,84,88,895,517,692,616,863,996,802,816,426,353,364,842,334,300,927,267,923,347,744,807,790,218,541,484,71,46,68,813,793,513,336,167,906,435,497,395,277,26,137,726,103,407,974,22,886,467,786,301,152,561,16,863,565,148,973,540,80,388,79,31,993,675,470,379,181,418,431,788,941,598,996,136,955,518,972,717,652,455,384,128,713,786,930,469,798,286,745,717,974,168,841,475,960,597,184,669,851,134,686,258,418,860,164,542,623,704,377,186,355,625,893,176,925,7,862,447,238,236,571,811,233,429,336,379,35,858,666,328,154,20,381,654,272,240,713,630,426,595,472,217,115,106,694,1,430,110,449,912,337,487,174,579,7,33,440,23,82,919,673,79,410,18,607,227,573,55,201,823,131,99,593,511,223,734,703,728,130,97,820,417,555,819,507,446,369,897,716,575,149,648,654,149,803,709,750,65,77,80,180,389,277,328,587,873,704,354,190,210,890,157,55,325,305,316,544,92,676,129,852,167,475,740,39,799,870,729,865,800,241,780,125,520,84,221,648,576,336,516,354,262,482,741,962,337,714,821,12,427,926,261,827,924,280,249,777,720,438,43,340,334,97,593,873,531,601,257,574,483,637,210,840,154,522,892,927,56,264,970,31,84,561,527,276,27,54,179,874,566,810,904,379,910,401,7,593,538,655,724,974,105,62,149,17,980,492,602,962,169,587,692,39,582,509,784,790,263,696,248,301,732,719,755,458,402,652,312,285,720,164,45,247,531,609,996,344,614,345,49,322,397,896,513,872,754,533,839,995,433,53,942,345,371,268,684,572,485,74,76,528,954,632,737,520,331,176,159,763,537,232,438,373,28,47,248,673,364,279,121,679,720,726,680,724,475,299,980,920,897,673,545,116,792,873,99,412,839,654,276,829,696,217,357,834,932,831,635,886,641,989,574,380,980,179,810,521,984,56,556,385,762,684,149,421,852,105,504,914,389,312,50,143,500,445,949,562,349,788,628,37,94,280,589,869,843,922,574,476,87,885,367,137,75,756,272,428,457,76,735,664,870,436,438,70,817,316,648,283,498,454,28,888,666,38,581,137,871,865,30,293,539,869,304,942,52,857,631,989,383,242,114,276,454,278,448,636,935,764,708,438,876,383,299,170,841,927,936,551,769,966,653,157,720,795,84,780,638,407,531,413,379,700,325,746,703,716,314,897,337,881,788,597,984,606,146,872,463,618,469,904,954,560,613,131,227,159,953,912,355,842,734,535,949,283,636,680,688,199,527,865,275,524,879,822,825,604,721,527,386,721,363,599,463,513,604,787,799,903,968,220,288,324,142,852,228,26,98,164,156,778,389,756,521,29,585,891,256,77,880,360,484,670,544,355,597,401,463,496,205,623,297,284,517,426,61,174,813,859,929,204,7,910,660,963,105,672,81,747,198,431,950,427,299,66,287,402,961,104,304,557,589,307,707,818,381,888,290,665,985,610,484,773,154,176,230,275,679,706,800,262,432,924,512,136,768,967,544,621,470,118,180,366,168,278,730,872,632,977,31,521,883,16,359,438,405,179,777,283,370,822,127,599,15,444,48,295,42,663,551,838,635,995,133,937,46,399,780,231,418,289,116,348,323,338,280,539,271,253,737,986,111,113,30,852,549,969,381,337,988,940,164,497,50,977,344,468,243,91,185,27,546,976,672,884,750,882,231,72,653,704,284,597,727,787,3,303,65,316,413,692,779,546,743,15,835,360,32,504,423,351,104,380,285,116,148,928,272,592,964,820,488,461,217,52,68,421,356,801,325,679,443,444,227,891,599,873,210,39,336,966,622,649,53,20,48,631,42,516,190,569,73,687,799,197,310,947,302,558,198,721,40,231,471,872,679,744,1,862,540,702,967,260,612,27,184,987,510,431,172,466,103,484,691,171,18,403,895,929,187,732,842,217,554,790,850,387,120,886,67,55,643,526,576,502,283,962,374,295,995,822,714,238,388,990,824,15,975,396,210,950,718,71,265,338,869,582,964,798,217,202,757,410,246,828,684,118,271,586,999,740,916,26,621,849,877,557,688,692,460,482,574,238,648,48,284,73,796,655,349,501,370,363,862,509,20,431,260,629,727,872,558,854,990,293,533,988,481,90,192,424,212,277,212,325,843,825,881,227,220,806,369,86,139,604,88,822,496,572,189,906,68,768,613,180,15,944,775,301,160,584,536,126,924,449,749,638,508,38,687,175,912,31,77,988,865,167,64,304,526,98,150,284,334,30,535,149,327,16,98,832,778,519,439,447,227,758,534,921,771,403,150,516,487,134,12,425,372,969,792,487,491,565,216,310,285,372,6,370,698,712,908,12,642,228,711,361,253,986,481,700,17,82,763,766,800,110,274,305,590,598,595,34,289,482,624,960,491,901,25,557,106,457,868,131,822,61,121,177,510,934,498,23,21,570,674,318,818,57,419,784,744,759,193,156,392,207,922,980,210,562,269,123,450,145,677,58,727,987,8,269,142,252,73,286,784,273,677,118,800,360,494,69,44,89,760,500,342,273,167,685,426,579,332,587,69,525,107,570,626,927,829,47,584,892,824,513,604,49,367,71,13,927,187,101,722,450,31,447,816,993,284,393,574,740,412,226,537,76,468,182,667,511,554,282,731,40,744,136,934,325,279,439,854,322,949,232,879,522,839,547,427,872,626,626,754,566,291,0,429,551,748,236,44,912,265,190,529,700,638,482,671,828,489,163,405,594,845,555,971,709,481,246,299,657,13,169,2,937,704,817,855,924,514,235,826,41,188,773,531,693,299,624,596,85,114,100,538,568,583,577,305,409,961,659,416,248,24,318,917,505,978,980,465,196,456,13,434,428,765,391,874,32,162,223,647,484,753,149,799,161,386,730,602,232,713,952,406,664,289,885,321,576,511,594,358,350,788,323,311,255,269,24,113,562,192,608,187,92,813,550,279,279,505,393,533,702,708,331,903,158,557,173,784,525,815,167,852,962,512,943,65,965,39,355,130,877,882,4,348,958,373,650,661,312,535,275,864,476,503,910,259,928,185,60,674,349,105,963,696,425,129,573,19,132,5,116,529,857,842,5,980,808,459,637,110,890,538,329,357,84,896,329,500,726,996,425,802,795,998,409,524,75,494,515,921,888,718,105,722,172,437,59,129,336,482,82,854,834,841,948,339,893,178,731,746,30,548,570,275,272,245,481,796,331,660,303,530,592,358,239,893,311,566,908,621,446,167,124,437,254,135,35,135,39,72,890,305,891,998,571,217,36,462,788,281,929,376,577,337,165,885,521,91,527,785,79,727,78,797,583,888,947,337,689,977,795,402,590,24,875,251,638,440,737,533,695,714,460,813,981,88,716,440,689,178,599,66,183,308,255,703,935,450,966,810,115,713,800,251,242,256,994,292,168,768,741,354,445,324,897,481,958,247,942,395,444,166,448,906,587,749,580,277,583,168,403,811,725,682,497,37,513,729,182,207,578,478,647,953,146,599,597,603,987,882,454,989,906,804,629,528,135,130,177,848,42,375,696,591,189,507,170,715,698,851,217,66,989,331,836,753,948,851,260,776,317,963,767,420,989,146,3,413,668,182,278,899,55,343,116,882,554,123,369,498,234,393,793,626,149,539,116,278,155,520,94,712,729,658,475,673,594,208,290,118,627,180,729,585,552,636,852,49,366,83,264,836,998,693,659,22,841,177,681,779,351,425,873,22,491,390,269,833,757,758,141,181,66,849,233,637,118,902,825,793,504,621,540,300,584,757,161,971,611,266,803,676,500,469,994,894,372,217,504,360,103,698,828,727,503,974,372,527,858,749,187,718,216,965,833,49,43,366,214,301,292,700,136,310,537,291,98,521,430,363,993,872,620,600,513,20,534,947,465,426,862,130,54,78,695,560,499,994,597,251,489,15,873,909,369,91,248,47,894,190,164,471,94,788,479,177,62,838,165,323,151,868,771,335,951,682,931,658,740,997,367,910,887,425,376,907,890,515,384,297,754,43,941,602,969,589,385,944,780,624,446,615,430,237,942,269,258,655,380,338,80,850,544,450,432,790,860,688,328,256,816,836,862,308,261,101,546,658,850,351,210,217,455,536,933,631,209,167,596,44,311,742,724,376,457,377,959,574,344,728,20,172,412,662,877,548,723,919,760,691,399,277,433,943,996,806,939,668,71,806,657,617,938,539,655,561,307,73,771,331,320,922,421,278,305,986,561,262,397,407,894,410,994,66,524,363,695,507,887,106,871,388,538,341,99,99,550,76,128,733,238,898,621,150,261,654,989,473,123,474,951,86,32,240,540,365,52,114,940,479,221,221,532,240,712,202,948,603,310,785,765,740,603,750,608,268,4,297,612,699,299,178,671,610,87,937,971,892,409,576,6,416,982,67,175,631,25,848,809,475,760,202,347,804,977,283,493,419,640,472,321,141,226,654,137,220,475,467,2,602,324,617,904,36,678,354,768,923,400,566,160,598,659,289,341,199,317,131,852,415,460,638,511,916,661,252,26,781,743,921,649,158,859,470,896,259,463,692,973,424,28,654,489,158,179,843,115,255,509,322,146,109,673,923,309,539,413,113,103,659,994,513,792,521,122,182,918,623,471,229,165,16,251,570,932,489,612,997,38,502,614,26