[NOIP2021] 報數


洛谷題面

題目大意

如果一個數 \(x\) 滿足:為 \(7\) 的倍數或 \(x\) 的數字中含有 \(7\)\(f(x)=1\);反之則 \(f(x)=0\)

給定 \(T\) 組數據,對於每組數據:

給定一個正整數 \(n\),如果 \(a\times k=n(a,k\) \(\texttt{均為正整數且}\) \(f(a)=1\) \()\),則輸出 \(-1\)

否則,找出第一個嚴格大於 \(n\) 的數 \(p\) 滿足 \(f(r)=0(r\) \(\texttt{為 p 的因數}\) \()\) \(\texttt{且}\) \(r\times k=p\)

題目分析

考試的時候直接降智,這就是個裸的變種篩數。思考 \(10~min\) 沒有思路,只打了暴力分。

\(70\) 分部分

思路

對於每個詢問,在線回答。

直接暴力判斷大於 \(n\) 的數字中是否含有不符合條件的因數。

如果找到了滿足條件的,直接輸出即可。

民間數據 \(70\) 分。

代碼

還是給個吧。

int T,n;

inline bool chk(int x)
{
	while(x!=0)
	{
		if(x%10==7)
		{
			return true;
		}
		
		x/=10;
	}
	
	return false;
}

inline bool solve(int x)
{
	for(register int i=1;i*i<=x;i++)
	{
		if(x%i==0)
		{
			if(chk(i)==true || chk(x/i)==true)
			{
				return true;
			}
		}
	}
	
	return false;
}

int main(void)
{
	T=read();
	
	while(T--)
	{
		n=read();
		
		if(solve(n)==true)
		{
			puts("-1");
			
			continue;
		}
		
		for(n=n+1;;n++)
		{
			if(chk(n)==false && solve(n)==false)
			{
				break;
			} 
		}
		
		printf("%d\n",n);
	}
	
	return 0;
}

\(100\) 分部分

思路

考時就想到了,由於算錯時間復雜度,覺得肯定會炸,於是打了 \(70\) 分跑路。

考后發現了自己的 zz 錯誤。

講一下做法:

先預處理出 \(1\sim 10^7+5\) 內所有不滿足條件的數。(注意這里的邊界)

如果經過判斷一個數 \(x\) 滿足 \(f(x)=1\),那么它的所有倍數都一定滿足 \(f(xk)=1\)。如果 \(x\) 滿足 \(f(x)=0\),那么把它加入 \(num\) 數組中。

然后詢問的時候:二分查找 \(num\) 數組中有沒有這個數(可以用 binary_searchlower_bound,如果用 lower_bound,可以判斷結果是否等於 \(n\),如果不等於,那么輸出 \(-1\))。

隨后二分查找在 \(num\) 數組中第一個大於等於 \(n+1\) 的數,輸出這個數即可。

代碼

const int ma=1e7+5;

int num[ma];

bool mark[ma]; 

int T,n;

int idx;

inline bool chk(int x)
{
	while(x!=0)
	{
		if(x%10==7)
		{
			return true;
		}
		
		x/=10;
	}
	
	return false;
} 

inline void init(int ri)
{
	for(register int i=1;i<=ri;i++)
	{
		if(chk(i)==true)
		{
			mark[i]=true;
		}
		
		if(mark[i]==false)
		{
			num[++idx]=i;
		}
		
		else
		{
			for(register int j=i*2;j<=ri;j+=i)
			{
				mark[j]=true;
			}
		}
	} 
}

int main(void)
{
	init(ma);
	
	T=read();
	
	while(T--)
	{
		n=read();
		
		if((*lower_bound(num+1,num+idx+1,n))!=n)
		{
			puts("-1");
		}
		
		else
		{
			int p=*lower_bound(num+1,num+idx+1,n+1);
			
			printf("%d\n",p);
		}
	}
	
	return 0;
}

\(\rm BB~In~Last\)

這次 NOIP 直接掛完了,感覺自己學一年的 \(\verb!OI!\) 簡直是個笑話。

人們總是說,時間是世界上最公平的,時間也是世界上最不公平的。我記住了,但沒有真正理解,現在,我想我理解了。世界上沒有真正的感同身受,即使把這條道理抄成千上萬遍,也沒有親身經歷過一次來的實在。

對於我這種一年時間幾乎 \(\dfrac{3.7}{12}\) 的時間都在頹廢的人,時間總是悄悄的從我的手中、鍵盤上溜走,等我緩過神來,往往已經是深夜了。

更讓我感到絕望的是:有天賦的人往往比普通人更為勤奮。

可笑的是,這一年內,我就這樣木然地看着旁人和自己的差距越拉越大,興致來了,感嘆幾句,然后繼續頹廢。

已經初二了,我還有多少時間啊......

\(\texttt{\color{blue}即使沒有舞台,你也要做你人生的主角。}\)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM