首页 > 代码库 > 辽宁省赛——杨鲁斯卡尔专场 -F
辽宁省赛——杨鲁斯卡尔专场 -F
题意:
题意就是输入N以EOF结尾,形成1-N的数字序列,然后选取一个幸运数字,每隔幸运数字的长度就将数字从序列中删掉,
选取幸运数字的规则是最开始是2,之后删掉数字之后每次选取序列中除1和选过的幸运数字外最小的。3<=n<=10000)
样例输入
20 30
样例输出
6 8
提示
eg.1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
For the first time, delete the last number in every two numbers. The sequence become 1 3 5 7 9 11 13 15 17 19
For the second time, the minimum number that has never been used is 3. Delete the last number in every 3 numbers. The sequence become 1 3 7 9 13 15 19
For the third time, the minimum number that has never been used is 7. Delete the last number in every 7 numbers. The sequence becomes 1 3 7 9 13 15.
Then you cannot delete any numbers. There are 6 numbers left over. So the answer is 6.
解题思路:
这题看着是一道模拟题,但是用模拟写一直超时,可能学的还不太好。之后发现了一个规律,幸运数字的选取看似是
随机的其实不是,是一个固定的序列,n的范围最大是10000所以可以打表,将幸运数字都打表下来,然后可以找到一个
公式,就是每次需要按照幸运数字减少多少。(注释:用c的输入输出比c++要快好多倍,至少这题一个时间是600多一个
是40多)
具体代码:
#include<iostream> #include<stdio.h> #include<vector> #include<iterator> #include<cstring> using namespace std; int pp[10005]; int jian[180]={2,3,7,9,13,15,21,25,31,33,37,43,49,51,63,67,69,73,75,79,87,93,99,105,111,115,127 ,129,133,135,141,151,159,163,169,171,189,193,195,201,205,211,219,223,231,235,237 ,241,259,261,267,273,283,285,289,297,303,307,319,321,327,331,339,349,357,361,367 ,385,391,393,399,409,415,421,427,429,433,451,463,475,477,483,487,489,495,511,517 ,519,529,535,537,541,553,559,577,579,583,591,601,613,615,619,621,631,639,643,645 ,651,655,673,679,685,693,699,717,723,727,729,735,739,741,745,769,777,781,787,801 ,805,819,823,831,841,855,867,873,883,885,895,897,903,925,927,931,933,937,957,961 ,975,979,981,991,993,997,1009,1011,1021,1023,1029,1039,1041,1053,1057,1087,1093, 1095,1101,1105,1107,1117,1123,1147,1155,1167,1179,1183,1189,1197,1201,1203,1209}; int main() { int n; while(scanf("%d",&n)!=EOF) { for(int i=0;i<180;i++) { if(n<jian[i]) { printf("%d\n",n); break; } n=n-n/jian[i]; } //printf("%d\n",len); } system("pause"); return 0; }