首页 > 其他分享 >[Codeforces] CF1811E Living Sequence

[Codeforces] CF1811E Living Sequence

时间:2023-12-21 19:16:13浏览次数:43  
标签:Living 正整数 CF1811E Codeforces int 100 now

CF1811E Living Sequence

这道题洛谷题解的思路比我的更好,可以参考一下题解,但是没人提到我这种做法

题意

给定一个正整数 \(k\) \((1\le k\le10^{12})\),请你输出第 \(k\) 个数字里没有 4 的正整数。

思路

设 \(f_i\) 表示前 \(10^i\) 个 \(i\) 位数里边不含4的数的个数,列举几个如下:

i 0 1 2 3
\(f_i\) 1 9 81 729

而估计一下,可以枚举到\(i=15\)

所以,就可以按位进行一个估计,拿\(100\)举例子:

最开始,一直从\(i=15\)枚举到\(i=2\),才发现第一个\(f_i\)比\(100\)小,于是当前的数加上\(100\),而前\(100\)个数里边,一共有\(81\)个不包含\(4\)的数

换句话说,\(100\)是第\(81\)个不包含4的数

接着,如果当前数再加\(100\)的话,个数就变成\(162\)了,比\(100\)要多,所以就不能加\(100\)了,转而到了\(i=2\),加\(10\)

接着进行如上操作,发现进行两次后,当前的数变成了\(119\),个数变为了\(99\),此时就应将\(i\)更改为\(i=1\)

随后就能够发现\(120\)就是不包含\(4\)的第\(100\)个不包含\(4\)的正整数

最后需要注意,由于我的规律是从\(0\)开始的,但是题目中要求的是正整数,所以在最开始的\(100\)就应该加一,相当于是把\(0\)给算进去了

还有一个要点,就是计算当前数的时候,如果遇到首位含有\(4\)的数,要跳过

代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int Maxn=20;
int f[Maxn];
int n,now,cnt;
int p(int x)
{
	int re=1;
	while(x--) re*=10;
	return re;
}
void run()
{
	cin>>n;n++;now=0;cnt=0;
	for(int i=15;i>=0;i--)
	{
		int x=0;
		while((x==4?now:now+f[i])<n) 
		{
			cnt+=p(i);
			if(x!=4) now+=f[i];
			x++;
		}
	}
	cout<<cnt<<"\n";
	return;
}
signed main()
{
	f[0]=1,f[1]=9;
	for(int i=2;i<=15;i++) f[i]=f[i-1]*9;
	int t;
	cin>>t;
	while(t--) run(); 
	return 0;
}

标签:Living,正整数,CF1811E,Codeforces,int,100,now
From: https://www.cnblogs.com/lyk2010/p/17919890.html

相关文章

  • [Codeforces] CF1817A Almost Increasing Subsequence
    CF1817AAlmostIncreasingSubsequence题意给定长度为\(n\)一个序列\(a\)以及\(q\)次询问,每次询问给出\(l\)和\(r\),找出序列\(a\)在\([l,r]\)内最长的几乎递增子序列。对于几乎递增的定义:如果一个序列中不存在连续的三个数\(x\),\(y\),\(z\),使得\(x\gey\ge\......
  • Codeforces Round 916 (Div. 3)
    目录写在前面ABCDE1/E2FG1G2写在最后写在前面比赛地址:https://codeforces.com/contest/1914。第二天没早八打个div3休闲娱乐保持下手感,然而div3都AK不了了,纯纯废物一个,天天上大学导致的。唉,一学期碰上好几个byd恼弹老师,大学一秒也不想上了,折磨。马娘台服马上1.5周......
  • Educational Codeforces Round 160 (Rated for Div. 2)
    A.RatingIncrease字符串处理#include<bits/stdc++.h>usingnamespacestd;voidsolve(){ strings; cin>>s; intn=s.size(); s=""+s; for(inti=1;i<=n-1;i++){ stringt=""; for(intj=1;j<=i;j++){ t=t+s[j]; } ......
  • Codeforces Round 916 (Div. 3)
    A.ProblemsolvingLogmap枚举字母#include<bits/stdc++.h>usingnamespacestd;voidsolve(){ intn; strings; cin>>n>>s; intans=0; s=""+s; map<char,int>mp; for(inti=1;i<=n;i++){ mp[s[i]]++; } for(autoc:mp)......
  • Codeforces Round 916 (Div. 3)(A~E2)
    A统计一下每个字母的出现次数然后输出即可#include<bits/stdc++.h>#definerep(i,a,b)for(registerinti=(a);i<=(b);++i)#definefep(i,a,b)for(registerinti=(a);i>=(b);--i)#definelsp<<1#definersp<<1|1#definePIIpair<int,int&......
  • [Codeforces] CF1795C Tea Tasting
    CF1795CTeaTasting题意有\(n\)个人和\(n\)杯茶,第\(i\)个人每次会喝\(b_i\)毫升的茶。第\(i\)杯茶有\(a_i\)毫升。总共会喝\(n\)轮茶,第\(j\)轮第\(i\)个人会尝试喝第\(i+1-j\)杯茶。喝的量为\(\min(a_{i+1-j},b_i)\)毫升,并且使\(a_{i+1-j}\)减少\(\mi......
  • Educational Codeforces Round 160 (Rated for Div. 2) A~C
    A.RatingIncrease题意:将一个字符串分成两个整数a和b,要求没有前导0,且a<b思路:遍历字符串s,若当前位置不是0,则拆分字符串,比较大小//#include<bits/stdc++.h>#include<iostream>#include<string>#include<cstring>#include<vector>#include<algorithm>#inclu......
  • Educational Codeforces Round 160 (Rated for Div. 2)
    基本情况A题秒了。B题卡了实在太久,BC题最后虽然都过了,但是耗时太久。感觉C对我来说更好写。B.SwapandDelete经典+3。总是一条路偏要走到黑了才会想着换思路,早该换了。一开始想了一大堆乱七八糟的思路,但都错了。后面往简单了想,这题毕竟最后必须要左对齐的,直接从左往右比......
  • 【题解】CodeForces-1913
    CodeForces-1913ARatingIncrease依题意模拟。提交记录:Submission-CodeForcesCodeForces-1913BSwapandDelete交换免费就是能任意重排,从头开始尽量填相反的,剩下只能删去了。提交记录:Submission-CodeForcesCodeForces-1913CGamewithMultiset从大到小能减则减一定......
  • 【题解】CodeForces-1905
    CodeForces-1905AConstructiveProblems发现沿着对角线放就行了,答案是\(\max(n+m)\)。提交记录:Submission-CodeForcesCodeForces-1905BBegginer'sZelda最优操作每次删两个叶子(除了最后一次只剩两个节点),所以答案是叶子个数除以二上取整。提交记录:Submission-CodeForc......