poj 2992 Divisors
这个题要用到欧拉函数;a1^p1*a2^p2*a3^p3……an^pn,那么他的因子就有(p1 +1)*(p2+1)*……*(pn+1);
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #include<cmath> #include<queue> #include<set> #include<map> #include<cstring> #include<vector> using namespace std; int prime[200],cnt=0,num[450][450]={0}; void Prime( ) { for( int i = 2 ; i <= 431 ; i ++ ) { int j ; for( j = 2 ; j < i ; j ++ ) { if( i % j ==0 ) break; } if( j == i ) { prime[cnt++] = i; } } } void Solve( ) { for( int i = 1; i <=431 ; i++ ) { int t = i; for( int j = 0; j < cnt ; j ++ ) { if( prime[j] > t ) break; while( t % prime[j] == 0 ) { num[i][prime[j]]++; t /= prime[j]; } } } for( int i = 2; i <= 431 ; i ++ ) { for( int k = 0 ; k < cnt ; k ++ ) { num[i][prime[k]] += num[i-1][prime[k]]; } } } long long Res( int n , int k ) { long long ans = 1; for( int i = 0; i < cnt ; i ++ ) { ans *= (num[n][prime[i]] - ( num[k][prime[i]] + num[n-k][prime[i]] ) + 1); } return ans; } int main( ) { int n,k; Prime(); Solve(); while( scanf( "%d %d",&n,&k )==2 ) { printf( "%lld\n",Res( n , k ) ); } //system( "pause" ); return 0; }