Cもいつもより易しめ。
http://arc034.contest.atcoder.jp/tasks/arc034_3
問題
正整数A,Bがある。
A!の倍数でB!の約数となる整数はいくつあるか。
解法
A!の倍数でB!の約数となる整数は、(B!/A!の約数)*(A!)ということになる。
よってB!/A!の約数を求めればよい。
幸いBとAの差は小さいので、(A+1)、(A+2)、…、Bをそれぞれ素因数分解して各素因数の次数を足し合わせ、各素因数の(次数+1)を掛け合わせればよい。
ll A,B; ll mo=1000000007; map<ll,int> enumdiv(ll n) { map<ll,int> V; for(ll i=2;i*i<=n;i++) while(n%i==0) V[i]++,n/=i; if(n>1) V[n]++; return V; } void solve() { int i,j,k,l,r,x,y; string s; cin>>A>>B; map<ll,int> H,T; for(i=B+1;i<=A;i++) { T=enumdiv(i); ITR(it,T) H[it->first]+=it->second; } ll ret=1; ITR(it,H) ret = ret*(it->second+1)%mo; cout<<ret<<endl; }
まとめ
ここまでは順調。