首页 > 其他分享 >ARC174D Digit vs Square Root 题解

ARC174D Digit vs Square Root 题解

时间:2024-03-20 13:11:58浏览次数:14  
标签:10 Digit Square frac 题解 ans mi times res

ARC174D Digit vs Square Root

题目大意

给定 \(N\),求有多少个正整数 \(x(1\leq x\leq N)\) 满足:在十进制表示下,\(\lfloor x\rfloor\) 是 \(x\) 的前缀。

Solve

很难直接手推性质,考虑用如下程序打表:

#include<bits/stdc++.h>
#pragma GCC optimize(1,2,3,"Ofast","inline")
using namespace std;
#define int long long
inline bool check(int x,int y)
{
	stack<int>a,b;
	while(x)
		a.push(x%10),x/=10;
	while(y)
		b.push(y%10),y/=10;
	while(!a.empty())
	{
		if(a.top()!=b.top())	return 0;
		a.pop();b.pop();
	}
	return 1;
}
signed main()
{
	int res=0,j,lst;
	for(int i=1;i<=1000000;i=-~i)
	{
		j=i;lst=res;
		while(check(sqrt(j*1.0),j))	j=-~j,res=-~res;
		if(j>i)	printf("%lld~%lld: %lld~%lld\n",i,j-1,-~lst,res);
		i=j;
	}
	return 0;
}

得到:

1~1: 1~1
80~80: 2~2
90~109: 3~22
9800~9800: 23~23
9900~10099: 24~223
998000~998000: 224~224
999000~1000999: 225~2224

我们不难可以发现这样的性质:

区间 \(\large[10^i-10^{\frac i 2},10^i+10^{\frac i 2}-1]\)(即 \(\large1,90\sim109,9900\sim10099\))中的所有数 以及 \(\large10^i-2\times 10^{\frac i 2}\)(即 \(\large80,9800,998000\))满足条件(\(\large i\) 均为偶数)

仔细想一下,确实很对。

对于区间 \([10^i-10^{\frac i 2},10^i+10^{\frac i 2}-1](i\mod 2=0)\),我们将他拆成 \([10^i-10^{\frac i 2},10^i-1]\) 和 \([10^i,10^i+10^{\frac i 2}-1]\) 来考虑:

  • 对于 \([10^i-10^{\frac i 2},10^i-1]\),即 \(9900\sim9999,999000\sim999999\),显然他们开根向下取整都是 \(10^{\frac i 2}-1\),即 \(99,999\),而且它们的前 \(\frac i 2\) 位也是 \(10^{\frac i 2}-1\)。并且这些数的数位都是偶数,对于每个 \(i\) 有 \(10^{\frac i2}\) 个。

  • 对于 \([10^i,10^i+10^{\frac i 2}-1]\),即 \(10000\sim10099,1000000\sim1000999\),它们开根向下取整都是 \(10^{\frac i 2}\),即 \(100,1000\),而它们的前 \(\frac i 2\) 位也是 \(10^{\frac i 2}\)。并且这些数的数位都是奇数,,对于每个 \(i\) 有 \(10^{\frac i2}\) 个。

对于 \(10^i-2\times 10^{\frac i 2}\),即 \(80,9800,998000\):

  • \((10^{\frac i 2}-1)^2=10^i-2\times 10^{\lfloor\frac i 2\rfloor}+1\),所以 \(\lfloor\sqrt{10^i-2\times 10^{\frac i 2}}\rfloor=10^{\frac i 2}-2\),即 \(\lfloor\sqrt{80}\rfloor=8,\lfloor\sqrt{9800}\rfloor=98,\lfloor\sqrt{998000}\rfloor=998\),显然 \(10^{\frac i 2}-2\) 是 \(10^i-2\times 10^{\frac i 2}\) 的前缀,而不是 \(10^i-2\times 10^{\frac i 2}-x\) 的前缀。这些数的数位都是偶数,,对于每个 \(i\) 有 \(1\) 个。

所以思路就很显然了:

  • 首先处理出 \(1\sim 10^i-1\) 之间的所有符合条件的数的个数 \(sum_i\)。

  • 对于每次询问,判断出 \(N\) 的位数 \(m\),无论 \(m\) 是奇数还是偶数,答案 \(ans\) 都可以先加上 \(sum_{i-1}\)。

  • 若 \(m\) 是偶数:如果 \(m\geq 10^m-2\times 10^{\frac m 2}\),令 \(ans\) 加上 \(1\);如果 \(N\geq 10^m-10^{\frac m 2}\),令 \(ans\) 加上 \(N-(10^m-2\times 10^{\frac m 2})+1\)。

  • 若 \(m\) 是奇数:令 \(ans\) 加上 \(\min(N,10^{m-1}+10^{\lfloor\frac m 2\rfloor}-1)-10^{m-1}\)。

Code

#include<bits/stdc++.h>
#pragma GCC optimize(1,2,3,"Ofast","inline")
using namespace std;
#define int long long
inline int read()
{
	short f=1;
	int x=0;
	char c=getchar();
	while(c<'0'||c>'9')	{if(c=='-')	f=-1;c=getchar();}
	while(c>='0'&&c<='9')	x=(x<<1)+(x<<3)+(c^48),c=getchar();
	return x*f;
}
inline int Get(int x)
{
	int res=0;
	while(x)
		res=-~res,x/=10;
	return res;
}
int t,n,sum[20],mi[20]={1},ans;
signed main()
{
	for(int i=1;i<=18;i=-~i)
	{
		mi[i]=mi[i-1]*10;
		sum[i]=sum[i-1]+mi[i/2];
		if(i%2==0)	sum[i]=-~sum[i];
	}
//	cout<<sum[3];
	t=read();
	while(t--)
	{
		n=read();
		int res=Get(n);
//		cout<<res<<endl;
		ans=sum[res-1];
		if(res%2==0)
		{
//			puts("into Case 1");
			if(n>=mi[res]-2*mi[res/2])	ans=-~ans;
			if(n>=mi[res]-mi[res/2])	ans+=n-(mi[res]-mi[res/2])+1;
		}
		else	ans+=min(n,mi[res-1]+mi[res/2]-1)-mi[res-1]+1;
		printf("%lld\n",ans);
	}
	return 0;
}

标签:10,Digit,Square,frac,题解,ans,mi,times,res
From: https://www.cnblogs.com/sorato/p/18084975

相关文章

  • 2024年3月18号题解
    DungeonMaster解题思路给格子编号,从1开始,这样我们就可以构建一个图对这个图跑迪杰斯特拉算法就可以得到我们需要的答案代码实现#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>#include<stdbool.h>#include<limits.h>#defineuunsigned#......
  • USACO24OPEN Bessie's Interview S 题解
    题意简述:有\(n\)个奶牛,\(k\)个农夫,\(k\len\),每一个奶牛有一个面试时长\(t_i\),表示面试这个奶牛要多长时间。\(0\)时刻时对于所有的\(1\lei\lek\),第\(i\)个农夫会面试第\(i\)个奶牛,之后的面试顺序满足以下条件:若在某时刻\(t\),存在某个农夫已经面试完当前的奶牛,那......
  • abc176F题解
    abs176F题意:给定长度为\(3\timesn\),值域是\([1,n]\)的序列,不断下列操作直至序列剩余\(3\)个数:1.对序列最左侧\(5\)个数进行任意排列。2.取出序列最左侧\(3\)个数,如果\(3\)个数一样,则得分加一,然后删除这三个数。问最大得分为多少。思路:神仙dp题。首先有一个显然的\(\Thet......
  • codeforce Round 935 div3 个人题解(A-E)
    A.SettingupCamp时间限制:每个测试1秒内存限制:每个测试256兆字节输入:标准输入输出:标准输出组委会计划在游览结束后带领奥林匹克运动会的参赛选手进行徒步旅行。目前,正在计算需要搭帐篷的数量。已知每顶帐篷最多可容纳3人。在参赛选手中,有a个内向型,b个外向型和c个综合型:......
  • 20240319每日一题题解
    20240319每日一题题解Problem判断一个数的结构是否为某个数重复两遍得到。例如,\(123123\)是重复两遍的数,而\(333\),\(809680\)​则不是保证输入的数字不超过longlong型范围。若是,则输出yes;否则输出no。Solution从数字的角度要想解决这个问题也不是不可以,但是不如将给定的数......
  • 【蓝桥杯选拔赛真题70】python最短路径和 第十五届青少年组蓝桥杯python选拔赛真题 算
    目录python最短路径和一、题目要求1、编程实现2、输入输出二、算法分析三、程序编写四、程序说明五、运行结果六、考点分析七、 推荐资料1、蓝桥杯比赛2、考级资料3、其它资料python最短路径和第十五届蓝桥杯青少年组python比赛选拔赛真题一、题目要求(注:i......
  • [ABC345F] Many Lamps 题解
    题意:给定一个\(n\)个点\(m\)条边的无向图,每个点的初始颜色为\(0\)。一次操作是将一条边的两个端点的颜色翻转。求是否能通过若干次操作使得最终有\(k\)个颜色为\(1\)的点。首先考虑什么情况下无解。会发现每一次操作,颜色为\(1\)的点的数量变化一定是\([0,+2,-2]\)......
  • CF1935 A-C题解
    A设\(s\)翻转后的字符串为\(t\),考虑进行\(n\)次操作可能生成出哪些字符串:只进行翻转操作——\(s\);先复制再\(n-1\)次翻转——\(s+t\);先翻转,再复制,再翻转\(n-2\)次,\(t+s\);多次复制的情况。情况2显然劣于情况1;情况4得到的字符串的开头一定是\(s\)或者\(t\)......
  • 初三多项式的运算练习 题解
    初三多项式的运算练习题解美好的下午时光要拿来写题解呜呜呜,一篇一篇地鸽得了。有些题要用到GF的知识,或许我可以找时间讲一下?贴一份我的FFT和NTT的板子。FFT:#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;intn,m,limit,f[1<<22],g[1......
  • 洛谷 P2934 [USACO09JAN] Safe Travel G 题解
    前话貌似别人都是使用并查集维护的方法,然而由于排序、最短路等算法瓶颈,以下令\(n\)和\(m\)同阶,总的时间复杂度依然是\(\Theta(n\logn)\)的,那么并查集是否有点大材小用了。事实上,在建完最短路径树后,我给出了两种带\(\log\)的数据结构完成此题。题目分析翻译里已经把问......