WEEK9 周记 限时赛——模拟题_咕咕东的奇妙序列

本文介绍了一个有趣的问题,如何找出无限序列“112123...”中的任意一项。序列由连续正整数组成,每部分包含从1到当前部分编号的所有数字。文章详细解析了算法思路,包括如何预处理信息、使用等差数列性质和二分搜索来高效定位目标数字。

WEEK9 周记 限时赛——模拟题_咕咕东的奇妙序列

一、题意

1.简述

一个奇怪的无限序列:112123123412345 …这个序列由连续正整数组成的若干部分构成,其 中第一部分包含1至1之间的所有数字,第二部分包含1至2之间的所有数字,第三部分包含1至3之间的所 有数字,第i部分总是包含1至i之间的所有数字。所以,这个序列的前56项会是 11212312341234512345612345671234567812345678912345678910,其中第1项是1,第3项是2,第20项是 5,第38项是2,第56项是0。
现在想知道第 k 项数字是多少!

2.输入格式

输入由多行组成。
第一行一个整数q表示有q组询问
接下来第i+1行表示第i个输入 ,表示询问第 项数字。

3.输出格式

输出包含q行
第i行输出对询问 的输出结果。

4.样例

Input

5 1 3 20 38 56

Output

1 2 5 2 0

Hint
数据点q(上限)k(上限)
1,2,350055
4,5,610010610^6106
7,8,9,1050010810^8108

二、算法

主要思路

这个题暴力的思想能够骗分,对于时间不够时这样干是聪明的。不过要想AC暴力的方法是行不同的。


这个题要充分挖掘和利用等差数列的性质。
针对下面这个序列讲解算法:
1121231234123451234561234567123456781234567891234567891012345678910111234567891011121234567891011121312345678910111213141512345678910111213141516
假设要找第70个数字,序列中已标红。
首先确定这个数字位于哪一种递增序列(这里以递增序列最后一个数是几位数来划分)。
所以我们需要先预处理一些信息。

//setLth存储递增序列最后一个数是i位数的集合中,共有多少个递增序列,由于k的数据量限制,我们只需要知道i<=9的setLth即可
//l_s[i]存储该集合中的第一个递增序列的数字个数,r_s[i]存储该集合中最后一个递增序列的数字个数
//需要注意的是,在同一集合中,两个递增序列的数字个数相差i个(即最后一个元素的位数)
//前一个集合i-1的最后一个递增序列的位数等于后一个集合i的第一个递增序列的位数-i。
//sum[i]算出这个集合i共有多少个数字(同一集合不同递增序列的数字个数是成等差数列增长的,所以总的位数可以利用等差求和公式来算)
setLth[1] = 9;    
l_s[1] = 1;
r_s[1] = 9;
sum[1] = cul(1,9,9);
for(i=2;i<=10;i++){
	setLth[i] = setLth[i-1]*10;
	l_s[i] = r_s[i-1] + i;
	r_s[i] = r_s[i-1] + setLth[i]*i; 
	sum[i] = cul(l_s[i],r_s[i],setLth[i]);   //cul是等差数列求和公式的实现
}

通过下面的代码确定k是属于哪个集合。

for(i=1;i<=10;i++){//确定k属于哪一个集合段(最大数位数相同为一个集合,一个集合中的元素之间的等差为位数) 
	if(k>sum[i]) k -= sum[i];
	else break;
}//出循环之后k是属于最大数位数为i的集合段

然后我们就可以确定k=70是属于递增序列最后一个数字位数为2的集合。之后我们需要确定k是在这个集合中的哪一个递增序列,即确定所属的递增序列的最后一个元素是多少。这里由于setLth[i]可能比较大所以用二分来遍历。

ll l = 1,r = setLth[i],mid,num; 
while(l<=r){//二分确定k属于该集合段中的哪一个递增段 
	mid = (l+r)/2;   //mid是第几个递增序列
	num = cul(l_s[i],r_s[i-1]+mid*i,mid);   
	    //num等于这个集合中到mid这个递增序列的最后一个元素,一共有多少个数字,或者说最后一个元素在集合中的位置是多少。
	if(k>num) l = mid+1;
	else r = mid-1;
}
num = cul(l_s[i],r_s[i-1]+r*i,r);
k -= num;  //更新k在递增序列中的位置

然后我们就可以确定k=70是属于递增序列:123456789101112。之后我们再确定k属于这个序列中的哪一种数的一部分(这里按照数的位数划分数字)。

for(i=1;k>r_s[i];i++){}//确定k是在几位数中,得到的i就是位数 
		k -= r_s[i-1];    //r_s数组还能接着用

因此我们确定k=70位于一个2位数中。之后我们再确定k是属于哪一个数的哪一位并最终确定这个数是什么。

ll pos = (k-1)/i+pow(10,i-1);//确定k在哪个数中
int wei = i-((k-1)%i);//确定了k在pos中是第几位 
int number = pos/(int)pow(10,wei-1) % 10;//确定这一位上是什么数字
	//需要强制类型转换,因为pow返回double 

三、代码

#include<iostream>
#include<cstring>
#include<string>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<queue> 
typedef long long ll;
ll sum[20],l_s[20],r_s[20],setLth[20];
ll cul(ll a,ll b, ll lth){
	return ((a+b)*lth)/2;
}
//应该先除再乘,这样能防止超出longlong,但这样的话就应该判断奇偶。 
using namespace std;
int main(){
	int i;
	setLth[1] = 9;
	l_s[1] = 1;
	r_s[1] = 9;
	sum[1] = cul(1,9,9);
	for(i=2;i<=10;i++){
		setLth[i] = setLth[i-1]*10;
		l_s[i] = r_s[i-1] + i;
		r_s[i] = r_s[i-1] + setLth[i]*i; 
		sum[i] = cul(l_s[i],r_s[i],setLth[i]); 
	}
	int q;
	scanf("%d",&q);
	for(int tt=0;tt<q;tt++){
		long long k;
		scanf("%lld",&k);
		for(i=1;i<=10;i++){//确定k属于哪一个集合段(最大数位数相同为一个集合,一个集合中的元素之间的等差为位数) 
			if(k>sum[i]) k -= sum[i];
			else break;
		}//出循环之后k是属于最大数位数为i的集合段 
		
		ll l = 1,r = setLth[i],mid,num; 
		while(l<=r){//二分确定k属于该集合段中的哪一个递增段 
			mid = (l+r)/2;
			num = cul(l_s[i],r_s[i-1]+mid*i,mid);
			if(k>num) l = mid+1;
			else r = mid-1;
		}
		num = cul(l_s[i],r_s[i-1]+r*i,r);
		k -= num;
		
		//前面的i没有用了 
		for(i=1;k>r_s[i];i++){}//确定k是在几位数中,得到的i就是位数 
		k -= r_s[i-1]; 
		
		ll pos = (k-1)/i+pow(10,i-1);//确定k在哪个数中
		
		int wei = i-((k-1)%i);//确定了k在pos中是第几位 
		int number = pos/(int)pow(10,wei-1) % 10;//确定这一位上是什么数字
			//需要强制类型转换,因为pow返回double 
		printf("%d\n",number); 
	} 
	return 0;
}
你的身份是高级编程技术专家,精通各类编程语言,能对编程过程中的各类问题进行分析和解答。我的问题是【我正在编辑【通达信条件选股】代码,遇到了 【 {—————————————— 优化后系统参数 ——————————————} {——动态估值体系——} DYNPETTM:=CLOSE/MAX(FINANCE(33)/FINANCE(1),1E-9) 详细信息 : 未知字符串 1E 错误起始位置 : 143 ; 长度: 2】,请帮我检查并改正错误点补全正确代码,生成修正后完整代码。原有选股逻辑完整保留。我的原始代码如下:【{—————————————— 优化后系统参数 ——————————————} {——动态估值体系——} DYNPETTM:=CLOSE/MAX(FINANCE(33)/FINANCE(1),1E-9); PB_RATE:=CLOSE/MAX(FINANCE(5),1E-9); PEG_VAL:=DYNPETTM/MAX((FINANCE(54)/MA(FINANCE(34),3))*100,1E-9); INDUSTRY_RS:=C/REF(C,20)/(INDEXC/REF(INDEXC,20)); {——智能波动率——} VOLATILITY:=STD(C,20)/MA(C,20); VAR_PERIOD:=FLOOR(60-200*VOLATILITY); FAST_LEN:=CEILING(VAR_PERIOD*0.618); SLOW_LEN:=FLOOR(VAR_PERIOD*1.618); {——情绪引擎——} MARKET_SENTI:=ADVANCE/DECLINE; HOT_INDEX:=EMA(SUM(IF(C=ZTPRICE(REF(C,1),0.1),VOL,0),20)/MA(V,20),5); MONEY_FLOW:=EMA((AMOUNT-REF(AMOUNT,1))/REF(AMOUNT,1),3); SENTI_ACCEL:=EMA(MARKET_SENTI,3)*HOT_INDEX/(1+ABS(MONEY_FLOW)); {—————————————— 多周期共振 ——————————————} {——战略层——} MONTH_MA:=EMA(C,400); MONTH_TREND:=C>MONTH_MA*1.03 AND SLOPE(MONTH_MA,3)>0; {——战役层——} WEEK_DIF:=EMA(C,12)-EMA(C,26); WEEK_DEA:=EMA(WEEK_DIF,9); WEEK_MACD:=2*(WEEK_DIF-WEEK_DEA); WEEK_VOL:=EMA(V,5)>EMA(V,21)*1.3 AND V>REF(MA(V,5),1)*1.6; {——战术层——} DAY_BREAK:=C>HHV(REF(HHV(H,30),1),3) AND V>MA(V,20)*1.8; DAY_RSI:=RSI(C,6)>68 AND RSI(C,12)>RSI(C,24)+5; {——微观层——} MIN60_BREAK:="MIN60.C">"MIN60.HHV(H,20)" AND "MIN60.V">"MIN60.MA(V,20)"*2.2; MIN60_RSI:="MIN60.RSI(12)">70; {—————————————— 信号合成 ——————————————} INDUSTRY_MOM:=RANK(SUM(C/REF(C,1)-1,20))*0.3 + RANK(INDUSTRY_RS)*0.7; DEBT_FILTER:=FINANCE(42)/FINANCE(1)<0.5; CASH_FLOW:=FINANCE(25)/FINANCE(1)>0.2; BETA_FILTER:=SLOPE(C/INDEXC,60) BETWEEN 0.85 AND 1.15; FINAL_SIGNAL:MONTH_TREND AND INDUSTRY_MOM>0.7 AND WEEK_MACD>REF(WEEK_MACD,1)*1.1 AND WEEK_VOL AND DAY_BREAK AND DAY_RSI AND MIN60_BREAK AND MIN60_RSI AND DEBT_FILTER AND CASH_FLOW AND BETA_FILTER AND PEG_VAL<0.8 AND DYNPETTM<25 AND SENTI_ACCEL>1.2 AND HOT_INDEX>1.0 AND MONEY_FLOW>0.08;】】
03-29
``` {—————————————— 优化后系统参数 ——————————————} {——动态估值体系——} DYNPETTM:=CLOSE/MAX(FINANCE(33)/FINANCE(1),0.000000001); PB_RATE:=CLOSE/MAX(FINANCE(5),0.000000001); PEG_VAL:=DYNPETTM/MAX((FINANCE(54)/MA(FINANCE(34),3))*100,0.000000001); INDUSTRY_RS:=C/REF(C,20)/(INDEXC/REF(INDEXC,20)); {——智能波动率——} VOLATILITY:=STD(CLOSE,20)/MA(CLOSE,20); {统一使用CLOSE替代C} VAR_PERIOD:=FLOOR(60-200*VOLATILITY); FAST_LEN:=CEILING(VAR_PERIOD*0.618); SLOW_LEN:=FLOOR(VAR_PERIOD*1.618); {——情绪引擎——} MARKET_SENTI:=ADVANCE/DECLINE; HOT_INDEX:=EMA(SUM(IF(CLOSE=ZTPRICE(REF(CLOSE,1),0.1),VOL,0),20)/MA(V,20),5); MONEY_FLOW:=EMA((AMOUNT-REF(AMOUNT,1))/REF(AMOUNT,1),3); SENTI_ACCEL:=EMA(MARKET_SENTI,3)*HOT_INDEX/(1+ABS(MONEY_FLOW)); {—————————————— 多周期共振 ——————————————} {——战略层——} MONTH_MA:=EMA(CLOSE,400); MONTH_TREND:=CLOSE>MONTH_MA*1.03 AND SLOPE(MONTH_MA,3)>0; {——战役层——} WEEK_DIF:=EMA(CLOSE,12)-EMA(CLOSE,26); WEEK_DEA:=EMA(WEEK_DIF,9); WEEK_MACD:=2*(WEEK_DIF-WEEK_DEA); WEEK_VOL:=EMA(V,5)>EMA(V,21)*1.3 AND V>REF(MA(V,5),1)*1.6; {——战术层——} DAY_BREAK:=CLOSE>HHV(REF(HHV(HIGH,30),1),3) AND V>MA(V,20)*1.8; RSI6:=RSI(6,CLOSE); {修正参数顺序} RSI12:=RSI(12,CLOSE); RSI24:=RSI(24,CLOSE); DAY_RSI:=RSI6>68 AND RSI12>RSI24+5; {——微观层——} MIN60_BREAK:= "MIN60.C#MIN60" > "MIN60.HHV(H,20)#MIN60" AND "MIN60.V#MIN60" > "MIN60.MA(V,20)#MIN60"*2.2; MIN60_RSI:="MIN60.RSI#MIN60"(12) >70; {跨周期调用保持规范} {—————————————— 信号合成 ——————————————} INDUSTRY_MOM:=RANK(SUM(CLOSE/REF(CLOSE,1)-1,20))*0.3 + RANK(INDUSTRY_RS)*0.7; DEBT_FILTER:=FINANCE(42)/FINANCE(1)<0.5; CASH_FLOW:=FINANCE(25)/FINANCE(1)>0.2; BETA_FILTER:=SLOPE(CLOSE/INDEXC,60)>0.85 AND SLOPE(CLOSE/INDEXC,60)<1.15; FINAL_SIGNAL:MONTH_TREND AND INDUSTRY_MOM>0.7 AND WEEK_MACD>REF(WEEK_MACD,1)*1.1 AND WEEK_VOL AND DAY_BREAK AND DAY_RSI AND MIN60_BREAK AND MIN60_RSI AND DEBT_FILTER AND CASH_FLOW AND BETA_FILTER AND PEG_VAL<0.8 AND DYNPETTM<25 AND SENTI_ACCEL>1.2 AND HOT_INDEX>1.0 AND MONEY_FLOW>0.08;```你的身份是高级编程技术专家,精通各类编程语言,能对编程过程中的各类问题进行分析和解答。我的问题是【我正在编辑【通达信条件选股】代码,遇到了 【RSI6:=RSI(6,CLOSE) 详细信息 : 引用的公式 的第 2 个参数应为数值,而不是数组! 错误起始位置 : 1239 ; 长度: 3 】,请帮我检查并改正错误点补全正确代码,生成修正后完整代码。原有选股逻辑完整保留。
最新发布
03-29
``` {—————————————— 系统参数模块 ——————————————} {——估值体系——} PE := IF(FINANCE(33)>0, FINANCE(30)/FINANCE(4), 1000); {动态市盈率} PB := IF(FINANCE(5)>0, FINANCE(30)/FINANCE(5), 1000); {市净率} {——波动率自适应系统——} VOLATILITY := STD(CLOSE,20)/MA(CLOSE,20); VAR_PERIOD := IF(VOLATILITY<0.08,55,IF(VOLATILITY<0.15,34,21)); MACD_FAST := MAX(5, CEILING(VAR_PERIOD*0.382)); {限制最小周期5} MACD_SLOW := MIN(60, FLOOR(VAR_PERIOD*1.618)); {限制最大周期60} MACD_SGNL := 9; {——多周期参数——} KDJ_N := 9; {KDJ周期} RSI_N := 14; {RSI周期} BOLL_N := 20; {布林线周期} MOM_N := 21; {动量基准周期} {—————————————— 核心指标系统 ——————————————} {——MACD自适应系统——} DIF := EMA(CLOSE,MACD_FAST) - EMA(CLOSE,MACD_SLOW); DEA := EMA(DIF,MACD_SGNL); MACD := 2*(DIF-DEA); {——均线系统——} MA5 := MA(CLOSE,5); MA10 := MA(CLOSE,10); MA20 := EMA(CLOSE,20); MA60 := EMA(CLOSE,60); {——量能系统——} VOL_MA5 := MA(VOL,5); VOL_MA20 := EMA(VOL,20); VOL_RATIO := VOL/REF(VOL,1); {——动量确认系统——} MOMENTUM := EMA(CLOSE,5)/REF(EMA(CLOSE,MOM_N),5)-1; WEEK_CHG := (CLOSE-REF(CLOSE,5))/REF(CLOSE,5)*100; MOM_CONFIRM := EMA(CLOSE,5)>EMA(EMA(CLOSE,5),13) AND CLOSE>HHV(CLOSE*0.7,40); {——KDJ系统——} RSV := (CLOSE-LLV(LOW,KDJ_N))/(HHV(HIGH,KDJ_N)-LLV(LOW,KDJ_N)+0.0001)*100; K := SMA(RSV,3,1); D := SMA(K,3,1); J := 3*K-2*D; {——布林带系统——} MID := MA(CLOSE,BOLL_N); UPPER := MID + 2*STD(CLOSE,BOLL_N); LOWER := MID - 2*STD(CLOSE,BOLL_N); BWIDTH := (UPPER-LOWER)/MID*100; {—————————————— 信号生成系统 ——————————————} {——趋势条件——} TREND_COND := MA5>MA10 AND MA10>MA20 AND CLOSE>MA60; {均线多头排列} {——突破条件——} BREAK_COND := CROSS(DIF,DEA) AND MACD>REF(MACD,1) AND DIF>0; {MACD金叉} {——量价条件——} VOLUME_COND := VOL>VOL_MA20*1.8 AND SUM(IF(CLOSE>REF(CLOSE,1),VOL*C,-VOL*C),5)/CAPITAL*100>3 AND SUM(IF(C>O,VOL*(C-O)/O,0),5)/SUM(VOL,5)*100>0.3; {——估值条件——} VALUE_COND := PE<30 AND PB<4.5; {估值双低} {——波动条件——} VOLAT_COND := BWIDTH>=10 AND BWIDTH<=18; {带宽过滤} {——筹码条件——} CHIP_COND := FINANCE(42)/FINANCE(1)<1.2; {流通盘比例} {——北向资金——} NORTH_COND := FINANCE(56)/FINANCE(55)>1.05 AND FINANCE(56)>50000000; {——风险过滤——} BETA_ADJ := 1 + (SLOPE(CLOSE/INDEXC,60)*STD(CLOSE,60)/STD(INDEXC,60)-1)*0.3; BETA_FILTER := BETA_ADJ < 1.2; {——日线预警条件——} DAILY_ALERT := CROSS(MA(CLOSE,5),MA(CLOSE,10)) AND VOL>REF(VOL,1)*1.5 AND CLOSE>OPEN; {——动量排名系统——} ROC21 := (CLOSE-REF(CLOSE,21))/REF(CLOSE,21)*100; RANK_ROC := (ROC21-LLV(ROC21,120))/(HHV(ROC21,120)-LLV(ROC21,120)+0.0001)*100; {—————————————— 信号合成系统 ——————————————} FINAL_SIGNAL:FILTER( TREND_COND AND BREAK_COND AND VOLUME_COND AND (VALUE_COND + VOLAT_COND + CHIP_COND >=2) AND {至少满足两个条件} MOM_CONFIRM AND RANK_ROC>80 AND DAILY_ALERT AND BETA_FILTER, 3); {—————————————— 风控系统 ——————————————} STOP_LOSS := MAX(MA10*0.93, LLV(LOW,8)*0.95); TAKE_PROFIT := BETA_ADJ*IF(VOLATILITY<0.1, MA20*1.25, MA20*1.35);```你的身份是高级编程技术专家,精通各类编程语言,能对编程过程中的各类问题进行分析和解答。我的问题是【我正在编辑【通达信量化择时周线选股】代码,遇到了 【:用2015-2024年全A股,进行回测量化代码选股的准确性】,提出选股逻辑和参数优化优化的建议。请帮我检查并补全正确代码,生成修正后语法规范的通达信完整代码。
03-23
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值