【数论】挖掘机技术哪家强(jzoj 3858)
挖掘機技術哪家強
jzoj 3858
題目大意
給你多個n,對于每個n,x為n的因數,設s(x)為小于x且與x互質的數的和,讓你求每一個x的s(x)總和
原題
有人問現實中為什么總是男生追求女生,反過來很少。實際上女生也是想主動追求男生的,但是世俗中對于主動追求男生的女生有種歧視,這樣就使得女生不大敢主動追求男生。但是面對喜歡的男生,難道就不出手么?女生只能步步為營,挖坑來引誘男生往里跳。這時候問題就來了,挖掘機技術到底哪家強?
被熱血沸騰的廣告洗腦了若干天后,Matt終于下定決心,毅然登上了開往泉城的列車,決心尋找生活的希望。
來到布魯謝特學院后,Matt逐漸地了解了各種型號的挖掘機。在這里我們可以認為有大挖掘機和小挖掘機兩種。
今天Matt的任務很簡單:首先他要用大挖掘機挖出恰好N單位體積的砂土。由于小挖掘機比較笨拙,它每次挖的砂土體積是固定的。也就是說,設每次挖x單位體積砂土,那么N需要被x整除。在挖出若干堆體積為x的砂土后,Matt需要計算x的“難挖指數”。體積x的“難挖指數”定義如下:對于某個不超過x的體積y,如果x與y的最大公約數為1,那我們認為體積y是“難挖的”,x的“難挖指數”就要加上y。
由于Matt之后還需要用小挖掘機處理被大挖掘機挖出的砂土,他希望知道所有可能的x的難挖指數的和,這樣他好估算今天要干多久,不然作為布魯謝特的高才生,他出門要被笑話的。
輸入樣例
3
2
3
4
輸出樣例
2
4
6
數據范圍
對于30%的數據有T?20,N?104。T\leqslant 20,N\leqslant 10^4。T?20,N?104。
對于60%的數據有T?100,N?107。T\leqslant 100,N\leqslant 10^7。T?100,N?107。
對于100%的數據有1?T?1000,1?N?109。1\leqslant T\leqslant 1000,1\leqslant N\leqslant 10^9。1?T?1000,1?N?109。
解題思路
挖掘技術肯定是藍翔啦(滑稽)
我們可以用歐拉函數x/φ(x)?2x/φ(x)*2x/φ(x)?2來求s(x)s(x)s(x)的值,具體可以上百度學習一下
然后我們把n質因數分解,然后再dfs枚舉每一個質數的指數,同時計算φ(x)φ(x)φ(x)的值就行了
代碼:
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define ll long long using namespace std; ll t, n, w, ans, prime[32000], s[32000], l[32000], p[32000]; void dfs(ll x, ll num, ll phi) {if (x > w){ans += num * phi / 2;//計算總數就要這樣if (num == 1) ans++;//1的情況return;}dfs(x + 1, num, phi);//指數為0ll sum = 1;for (ll i = 1; i <= l[x]; ++i){sum *= s[x];//總數dfs(x + 1, num * sum, phi * (sum / s[x]) * (s[x] - 1));//sum是計算n的一部分然后就是/s[x]*(s[x] - 1)} } int main() {for (ll i = 2; i <= 32000; ++i)if (!p[i]){prime[++prime[0]] = i;//計算質因子for (ll j = i * i; j <= 32000; j += i)p[j] = 1;}scanf("%lld", &t);while(t--){ans = 0;w = 0;memset(l, 0, sizeof(l));scanf("%lld", &n);for (ll i = 1; i <= prime[0]; ++i)if (n % prime[i] == 0)//看看有沒有這個質因子{s[++w] = prime[i];while(n % prime[i] == 0){l[w]++;n /= prime[i];}}if (n > 1) s[++w] = n, l[w] = 1;//大于sqrt(n)的最多有一個dfs(1, 1, 1);printf("%lld\n", ans);}return 0; }總結
以上是生活随笔為你收集整理的【数论】挖掘机技术哪家强(jzoj 3858)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: buy的第三人称单数 buy的第三人称单
- 下一篇: 关于孩子在家的表现的简短评语有哪些 怎么