数论专题hdu2582
Posted mtl6906
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数论专题hdu2582相关的知识,希望对你有一定的参考价值。
本题题意:给出公式f(n) = gcd(3) + ... + gcd(n),而gcd(n) = gcd(C(1,n),...,C(n-1,n)),求出f(n)的值。
代码如下:
#include <iostream> using namespace std; typedef long long ll; const int Max = 1000000; int prime[Max+1]; ll sum[Max+1]; void Prime(){ int t = 2; ll i; while(t <= Max){ for(i=t;i<=Max;i+=t){prime[i] = 1;} for(i=t;i<=Max;i*=t){prime[i] = t;} for(i=t;i<=Max;i++){ if(prime[i] == 0){ t = i; break; } } if(i == Max+1){ break; } } } void Sum() { sum[3] = 3; for(int i=4;i<=Max;i++){ sum[i] = sum[i-1] + prime[i]; } } int main() { Prime(); Sum(); int n; while(cin >> n){ cout << sum[n] << endl; } return 0; }
通过打表发现当为p^k形式时(p为素数),gcd(n) = p,否则 gcd(n) = 1,然后就筛下素数,计算下和,结果就出来了。
不过需要注意的是不用long long会flow。
以上是关于数论专题hdu2582的主要内容,如果未能解决你的问题,请参考以下文章