ural 1104. Don’t Ask Woman about Her Age

给你一个未知进制表示的数(小于等于36进制,长度最长100W),求一个进制,使得这个进制的这个数可以整除进制-1.

 

比如样例,22进制的A1A可以整除21.

 

我没多想,直接拿大数做了。。。只需要判断是否能整除,所以还是好写的,不过以前只写过除2的,其实都一样~~~

 

后来btw说他的方法了,因为这个数等于 b*x+a,所以它模(b-1)就是(x+a)%b。。。自己想下就好了。。。T T。。

 

不过写出来大数多进制除法还是蛮好的~

 

#include <stdio.h> #include <stdlib.h> #include <iostream> #include <algorithm> #include <math.h> using namespace std; const int MAX = 1000010; int a[MAX],len; char str[MAX]; bool div(int *a,int base,int d) { int tmp = 0; for(int i=0; i<len; i++) { tmp *= base; tmp += a[i]; if( tmp >= d ) tmp = tmp - (tmp / d) * d; } return tmp == 0 ; } int solve() { int beg = 0; for(int i=0; i<len; i++) if( a[i] > beg ) beg = a[i]; if( beg <= 1 ) return 2; for(int i=beg+1; i<=36; i++) if( div(a,i,i-1) ) return i; return -1; } int main() { scanf("%s",str); len = strlen(str); for(int i=0; i<len; i++) if( isdigit(str[i]) ) a[i] = str[i] - '0'; else a[i] = str[i] - 'A' + 10; int ans = solve(); if( ans == -1 ) printf("No solution./n"); else printf("%d/n",ans); return 0; }  

你可能感兴趣的:(div)