1. 程式人生 > >CodeForces 758 D Ability To Convert

CodeForces 758 D Ability To Convert

就是 first 沒有 codeforce push_back test cond def ==

Ability To Convert

題意:給你一個n進制的60位的數,但是由於Alexander只會寫0->9,所以他就會用10來表示十而不是A(假設進制>10);

題解:模擬就好了,先走往前走進制的位數的倍數,再判斷一下首位是不是0,或者這個數有沒有大於等於進制,如果有就不行,就要往後走,走到一個非0開頭的點,或者就是走到只有1個0的點,然後算出目前這段區間的答案加一個倍數就好了。

代碼:

技術分享圖片
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define Fopen freopen("_in.txt","r",stdin); freopen("_out.txt","w",stdout);
 4
#define LL long long 5 #define ULL unsigned LL 6 #define fi first 7 #define se second 8 #define pb push_back 9 #define lson l,m,rt<<1 10 #define rson m+1,r,rt<<1|1 11 #define max3(a,b,c) max(a,max(b,c)) 12 #define min3(a,b,c) min(a,min(b,c)) 13 typedef pair<int,int> pll; 14 const
int INF = 0x3f3f3f3f; 15 const LL mod = (int)1e9+7; 16 const int N = 2e5 + 100; 17 char str[N]; 18 char cmp[N]; 19 LL ans = 0; 20 LL tmp = 0; 21 LL n = 0; 22 LL base = 1; 23 LL b = 1; 24 LL t; 25 vector<LL> vc; 26 int main(){ 27 scanf("%s", cmp); 28 int len1 = strlen(cmp); 29 for(int i = 0
; i < len1; i++){ 30 n = n*10 + cmp[i] - 0; 31 } 32 scanf("%s", str); 33 if(str[0] == 0){ 34 cout << 0 << endl; 35 return 0; 36 } 37 int len2 = strlen(str); 38 for(int i = len2-1; i >= 0;){ 39 int j = i - len1 + 1; 40 if(j < 0) j = 0; 41 //cout << j <<‘ ‘<< i << endl; 42 if((j+len1-1 == i && strcmp(cmp,str+j) <= 0) || str[j] == 0){ 43 j++; 44 if(j >= i) j = i; 45 while(str[j] == 0 && j < i) j++; 46 t = 0; 47 for(int k = j; k <= i; k++) 48 t = t*10 + str[k] - 0; 49 ans += b*t; 50 b *= n; 51 } 52 else { 53 t = 0; 54 for(int k = j; k <= i; k++) 55 t = t*10 + str[k] - 0; 56 ans += b*t; 57 b *= n; 58 } 59 i = j - 1; 60 } 61 printf("%I64d", ans); 62 return 0; 63 }
CF 758 D

CodeForces 758 D Ability To Convert