【 HDU - 1215 】七夕节(数论,约数和公式)
題干:
七夕節(jié)那天,月老來到數(shù)字王國,他在城門上貼了一張告示,并且和數(shù)字王國的人們說:"你們想知道你們的另一半是誰嗎?那就按照告示上的方法去找吧!"?
人們紛紛來到告示前,都想知道誰才是自己的另一半.告示如下:?
數(shù)字N的因子就是所有比N小又能被N整除的所有正整數(shù),如12的因子有1,2,3,4,6.?
你想知道你的另一半嗎??
Input
輸入數(shù)據(jù)的第一行是一個(gè)數(shù)字T(1<=T<=500000),它表明測試數(shù)據(jù)的組數(shù).然后是T組測試數(shù)據(jù),每組測試數(shù)據(jù)只有一個(gè)數(shù)字N(1<=N<=500000).?
Output
對(duì)于每組測試數(shù)據(jù),請(qǐng)輸出一個(gè)代表輸入數(shù)據(jù)N的另一半的編號(hào).?
Sample Input
3 2 10 20Sample Output
1 8 22解題報(bào)告:
? ? ?約數(shù)和,可以打表,可以直接算。
AC代碼1:(打表)(93ms,打表的i那層循環(huán)到500000/2,則78ms)
#include<bits/stdc++.h>using namespace std; int num[500000 + 5],n; int main() {for(int i = 1; i<=500000; i++) {for(int j = 2*i; j<=500000; j+=i) {num[j] += i;}}int t; cin>>t;while(t--) {scanf("%d",&n);printf("%d\n",num[n]);}return 0 ;}AC代碼2:(不打表,Tsqrtn的復(fù)雜度)(296ms)
#include <bits/stdc++.h> #define ll long long using namespace std; const int MAX = 1e5+10; int p[MAX]; int a[MAX]; ll qpow(ll a,ll b) {ll ans = 1;while(b){if(b & 1) ans *= a;b >>= 1;a *= a;}return ans; } int main() {int t;scanf("%d",&t);while(t--){int n;scanf("%d",&n);int cnt = 0;int tmp = n;// memset(a,0,sizeof a);for(int i = 2; i * i <= n; i++) {if(tmp % i == 0) {p[++cnt] = i;a[cnt]=0 ; while(tmp % i == 0) {a[cnt]++;tmp /= i;}}}if(tmp != 1) {p[++cnt] = tmp;a[cnt] = 1;}ll ans = 1;for(int i = 1; i<=cnt; i++) {ans *= (qpow(p[i],a[i]+1) - 1) / (p[i]-1);}printf("%lld\n",ans-n);//因?yàn)樽詈笠敵龅氖浅プ约旱?#xff0c;因?yàn)槭且蜃?#xff0c;因子不包括自己。 }return 0; }總結(jié):? 這題你如果對(duì)a數(shù)組進(jìn)行直接memset,那恭喜你,超時(shí)了。? 因?yàn)門太大了,不能直接memset,只能初始化到sqrt才可以。這是比較坑的一個(gè)地方。
附:Tsqrt分解素?cái)?shù)時(shí)的另一種簡潔做法(省掉一個(gè)數(shù)組)
void getprimefactor(long long n) { //計(jì)算冪次方;int cas=0;for(int i=0; i<len&&prime[i]*prime[i]<=n; i++) {while(n%prime[i]==0) { //可以整除;factor[cas]++;n/=prime[i];}if(factor[cas] != 0)//就是進(jìn)入了while里面的;cas++;}if(n>1)factor[cas]=1; //就是因?yàn)樯厦鎓or條件的原因;prime[i]*prime[i]<=n當(dāng)不滿足這個(gè)條件的時(shí)候就應(yīng)該還有一個(gè)素?cái)?shù)的一次方 }?
總結(jié)
以上是生活随笔為你收集整理的【 HDU - 1215 】七夕节(数论,约数和公式)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【HDU - 3410 】 Passin
- 下一篇: scanserver.exe - sca