這題我中午是12點以后開始做的,只剩下1個小時了,12點50的時候完成了框架,但是細節總是實現不對,現在晚上來復盤的時候才把這題A出來了。
但是,就像高考的導數你整個思路都會,你死在了求導上。。。(剛才A出來的那一刻真的快把我氣哭了哈哈哈哈哈哈還不如不做出來呢)
題面
分析
眾所周知,藍橋杯是數學杯。所以這題有沒有什么數學方法來求解呢?
我們不妨先觀察一下10-100的數據,一共有5*9個:
10 12 14 16 18
21 23 25 27 29
30
41
50
61
70
81
90
100-1000
101 103 105 107 109
121
141
161
181?
210 212?214?216?218
230?
250
270
290?
一直到900多,合計5*5*9個。
同理,1000-10000的區間,5*5*5*9個。那么就有規律了
現在我們回頭用數學知識解釋一下,第一位是1-9,但是接下來的每一個都只能選5個,因為不是奇數就是偶數。
那么,我們可以先通過n定位到ans的數量級。具體做法就是定義一個區間數組,落在哪里,數量級就能通過它定下來。
定下了數量級,那么我們是不是還可以進一步縮小范圍,確定它的第一位?具體實現就是確定出這一位,我們設為hhh(但是實際上是hhh+1)
接下來我們再用一個循環,從左到右依次確定每一小位。
為什么第一位要單獨拎出來呢?就是因為第一位可以選9個數,但是后面的數都根據前一位數的奇偶性來判定。
我們用一個例子來說明我的代碼:n=716
716推出pos=2,那么npos=3,ans=1000,leave=716-270=446。(此時確定ans數量級是1000)
hhh=446/125=3,leave=446%125=71,那么ans=1000+3*1000=4000(具體確定出第一位)
然后進入循環
1.fst=4,npos=2,hhh=71/25=2,leave=71%25=21,ans=4000+2*hhh*pow(10,npos)=4400
但是第二位和第一位撞了,所以需要加100避開,ans=4500
2.fst=5,npos=1,hhh=21/5=4,leave=21%5=1,ans=4500+2*hhh*pow(10,nops)=4580
第三位不用改變
3.fst=8,npos=0,hhh=4/1=4,leave=0,ans=4580+2*hhh*pow(10,npos)=4582
第四位需要+pow(10,pos),ans=4583.
循環結束
但是,我們驗證這個例子,n=716應該對應4581!除此之外,n=1時ans=12,n=11時n=32。
這就是我中午死掉的地方。
我們n自減1就行了。
我中午沒想出來,一直在改循環,現在也不知道改沒改對,能對幾個,反正,,,我做好15分全死的準備了,心痛www
Code
代碼功底比較爛,有很多變量名設置需要大家自己理解!求包容。
#include<iostream>
#include<cmath>
#define mx 1000000007
using namespace std;
long long qujian[25]={0};
long long n;
int main()
{qujian[1]=45;for(int i=2;i<=16;i++){qujian[i]=qujian[i-1]+9*pow(5,i);}cin>>n;n-=1;long long pos=0;for(int i=0;i<=20;i++){if(n>qujian[i]&&n<=qujian[i+1]){pos=i;break;}}//cout<<pos<<endl;long long leave=n-qujian[pos];long long npos=pos+1;long long ans=pow(10,pos+1);//cout<<ans<<' '<<leave<<' '<<npos<<endl;//先把開頭的0-9判掉long long hhh=leave/pow(5,pos+1);leave%=(long long)pow(5,pos+1); ans=ans*(hhh+1);//cout<<hhh<<' '<<leave<<' '<<ans<<' '<<npos<<endl;while(npos){long long fst=ans/(long long)pow(10,npos)%10;//cout<<fst<<endl;--npos;hhh=leave/(long long)pow(5,npos);leave%=(long long)pow(5,npos);ans+=2*hhh*(long long)pow(10,npos); if(fst%2==0){//偶數 ans+=(long long)pow(10,npos); }//cout<<hhh<<' '<<leave<<' '<<ans<<endl;}cout<<ans<<endl;return 0;
}