目錄
題目大意:輸出n個數,分別輸出這n個數所有的約數
# include # include # include using namespace std;
const int n = 1e5 + 10;
vectorsolve (int n)
}sort (a.begin(),a.end());
return a;
}int main()
}
基於算術基本定理
n = (p1x1)(p2x2)(p3x3)…(pkxk)
約數個數=(x1+1)(x2+1)(x3+1)…(xk+1)
注意,這裡的p1...pi是指質因子
例子
24=2223=2³3
再用各個質數的指數加一後再相乘即為此數的約數個數,
比如 (3+1)(1+1)=42=8, 即表示24有8個約數。
24的約數:1、2、3、4、6、8、12、24
思路就是先把原數分解為質因數,最後把每乙個數的指數累加即可。從a1一直分解到an,由於a的資料過大,此處用雜湊表進行儲存。
題目:求n個數的乘積的約數個數
因此不能乘起來再求,這裡用雜湊表存一下質因子和其指數,用相應的公式求解
# include using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
int main()
}// x最大公約數可能大於sqrt(x),將剩餘的質因數讀取進去
這裡的約數個數和約數之和 這兩個公式是建立在質因字的前提下
題目:求n個數的乘積的約數之和 同上題一樣
# include using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
int main()
}if (x > 1) hash[x] ++;
}ll ans = 1;
for (auto i: hash)
ans = ans * t % mod;
}cout << ans;
return 0;
}
題目: acwing3491
題意 : 輸出乙個數a, 讓你求出乙個最小的數b,使得a*b是某數的平方
思路: 求出a的所有質因數及其質因數的指數,那麼ans就是指數為奇數的質因數的乘積
**
# include # include # include # include using namespace std;
typedef long long ll;
int main()
}if(n > 1) hash[n] ++;
for (auto i : hash)
cout << ans;
return 0;
}
數論學習之約數
最近學數論真的感覺自己腦子很不好用啊,乙個證明題想半天。感覺一些基礎的知識還是比較重要的,所以就記錄下來吧,加深一下印象。對於乙個整數n,假如我們想求到這個整數的所有的約數的話,我們只要對其1 n 1 sqrt 1 n 之間找可以被n整除的那些數,然後就可以找到它們的約數了。時間複雜度o n o s...
數論 約數個數
這題是個大水題,只不過資料稍微大了點。結果大家都用那啥的模擬。結果哈哈哈哈哈哈。求a b之間每個數的約數個數的總和。input 一行兩個正整數a b,以乙個空格隔開。output 一行乙個整數,即答案。資料範圍 對於50 的資料,1 a b 1000 對於100 的資料,1 a b 10,000,0...
數論基礎之素數,約數
關於約數 唯一分解定理 任何數都可由素因子之積構成 int p 100 a 100 cnt void divide int n if n 1 for int i 1 i cnt i cout 方法2 離線做法,預處理出乙個質因子樹。預處理o nlogn 查詢乙個數o logn void init v...