Lightoj 1341(質因子分解)
阿新 • • 發佈:2019-01-26
題意:給出一個長方形的面積,然後求長和寬都不能小於m的方案數。
思路:先對這個面積進行質因子分解,得到這個數的所有的因子數,然後因為是不能是正方形,所以他能組成的方案書為因子數/2,要得到大於等於m的話,直接減去小於m的數。
注意剛開始要判斷m * m 是否是小於等於n,這樣的話m就小於等於1e6了,不會超時。
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> P; #define fi first #define se second #define INF 0x3f3f3f3f #define clr(x,y) memset(x,y,sizeof x) #define PI acos(-1.0) const int maxn = 2e6 + 20; const int Mod = 1e9 + 7; int prime[maxn],is_[maxn]; ll n,m;int len; void Init() { len = 0;clr(is_,true); for(int i = 2; i < maxn; i ++) { if(is_[i]) { prime[len ++] = i;for(int j = i * 2; j < maxn; j += i)is_[j] = false; } } } int main() { Init(); int Tcase;scanf("%d",&Tcase); for(int ii = 1; ii <= Tcase; ii ++) { scanf("%lld%lld",&n,&m); if(m * m > n){printf("Case %d: 0\n",ii);continue;} ll ans = 1,t = n; for(int i = 0; i < len && prime[i] * prime[i] <= n; i ++) { if(n % prime[i] == 0) { int cnt = 0;while(n % prime[i] == 0){n /= prime[i];cnt ++;}ans = ans * (cnt + 1); } } if(n > 1)ans <<= 1; // cout << ans << endl; ans /= 2; for(int i = 1; i < m; i ++)if(t % i == 0)ans --; printf("Case %d: %lld\n",ii,ans); } return 0; }