本文共 1586 字,大约阅读时间需要 5 分钟。
求能使a,b同余的正整数m的个数,即a,b差的因子个数。
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include 13 #include 14 #include 15 #include 16 #include 17 18 using namespace std;19 typedef pair II;20 typedef vector IV;21 typedef vector IIV;22 typedef vector BV;23 typedef long long i64;24 typedef unsigned long long u64;25 typedef unsigned int u32;26 #define For(t,v,c) for(t::const_iterator v=c.begin();v!=c.end();++v)27 #define IsComp(n) (_c[n>>6]&(1<<((n>>1)&31)))28 #define SetComp(n) _c[n>>6]|=(1<<((n>>1)&31))29 const int MAXP = 46341;30 const int SQRP = 216;31 int _c[(MAXP>>6)+1];32 IV primes;33 void prime_sieve()34 {35 for ( int i = 3; i <= SQRP; i += 2 )36 if ( !IsComp(i) ) for ( int j = i*i; j <= MAXP; j+=i+i ) SetComp(j);37 primes.push_back ( 2 );38 for ( int i = 3; i <= MAXP; i += 2 ) if ( !IsComp(i) ) primes.push_back ( i );39 }40 41 int count_divisors ( int n )42 {43 int ret = 1;44 int sn = sqrt ( n );45 For ( IV, it, primes ) {46 int prime = *it;47 if ( prime > sn ) break; if ( n % prime ) continue;48 int e = 0; for ( ; n%prime == 0; e++, n/= prime );49 ret *= e+1;50 sn = sqrt(n);51 }52 if ( n > 1 ) ret *= 2;53 return ret;54 }55 int main()56 {57 prime_sieve ( );58 int a,b;59 while(scanf("%d%d",&a,&b)!=EOF)60 {61 if(a==0&&b==0)62 break;63 printf("%d\n",count_divisors(abs(a-b))) ;64 }65 66 67 return 0;68 }
转载于:https://www.cnblogs.com/Acgsws/archive/2013/06/10/3130963.html