Problem 172 「桁の繰り返しが少ない数の調べ上げ」 †
どの数字も3回を超えて現れないような18桁の数(先頭の0は許されない)はいくつあるか?
競技プログラムになれてるとついつい漸化式や動的計画法などを利用して計算量を下げれないかと考えてしまいますが。
ここは単純に全探索が一番早いです。
#include<stdio.h>
#include<iostream>
__int64 all,ans=0;
int divs[4]={1,1,2,6};
void f(int n,int len,__int64 perm){
if(n==10){
if(len==17){
ans+=(all/perm);
}
}else{
for(int i=0;i<=3-(n==1);i++){
if(len+i>17)break;
f(n+1,len+i,perm*divs[i]);
}
}
}
int main(){
all=1;
for(int i=1;i<=17;i++)all*=i;
f(0,0,1);
std::cout<<ans*9<<"\n";
}
最終更新:2016年01月11日 16:18