2008-12-25
SRM403 Div1 Easy: TheLuckyNumbers
10^9のループではTLEになるであろう数え上げ系。すこし手間取った(141.71points)。
こういうので200点以上とれるようになりたい。
int c(int n, int r)
{
if (n == 0 || r == 0 || r == n) return 1;
if (r > n-r) r = n-r;
return n * c(n-1,r-1) / r;
}
int expt(int x,int n){
int v=1; rep(i,n) v*=x; return v;
}
class TheLuckyNumbers {
public:
int s_(int k,int n){
int cnt=0;
rep(i,1<<k){
int u=0,m=1<<(k-1);
rep(j,k){u*=10; u+=(i&m)?7:4; m>>=1;}
if (n>=u) cnt++; else break;
}
return cnt;
}
int s(int k){
return expt(2,k);
}
int lns(int n){
if (n<4) return 0;
if (n<7) return 1;
if (n<44) return 2;
if (n>777777777) n=777777777;
int k=0,t=0,o=1;
int n_=n;
while(n_>0){ t=n_; n_/=10; o*=10; k++; }
o = (o-1)/9;
int o4=o*4, o7=o*7;
int kt=k;
int cnt=0;
if (n<o7) {
kt--;
if (n>=o4) {
cnt += s_(k,n);
}
}
rep(i,kt) cnt+=s(i+1);
return cnt;
}
int count(int a, int b) {
return lns(b)-lns(a-1);
}
};
コメント
トラックバック - https://topcoder-g-hatena-ne-jp.jag-icpc.org/n4_t/20081225