2010-04-04
SRM466 Easy: LotteryCheating
過去問 | |
![]()
- 約数の個数が奇数 = 平方数
- n = p1^a1 * p2^a2 * ... * pn^an のとき
- 約数の個数は (a1+1)(a2+1)..(an+1)
- これが奇数ということはa1...anはすべて偶数
- だったら n={(p1^(a1/2))(p2^(a2/2))..(pn^(an/2))}^2
- 0≦n≦9999999999 なので0≦x≦99999の二乗を調べればよい
- それぞれの平方数と比較して、何文字異なるか
typedef long long ll;
#define sz(a) int((a).size())
#define pb push_back
#define rep(var,n) for(int var=0;var<(n);var++)
#define all(c) (c).begin(),(c).end()
class LotteryCheating {
public:
int minimalChange(string ID) {
int n=sz(ID);
ll nmax=1; rep(i,n) nmax*=10; nmax--;
int ch=n+1;
for(ll i=0;i<100000;i++){
ll ii=i*i; if (ii > nmax) break;
string iis(n,'0');
rep(j,n) { iis[n-1-j] = '0' + (ii%10); ii/=10; }
int cn=0;
rep(j,n) {
if (iis[j]!=ID[j]) cn++;
}
ch = min(cn,ch);
}
return ch;
}
};
- passed system test
コメント
トラックバック - https://topcoder-g-hatena-ne-jp.jag-icpc.org/n4_t/20100404