51nod1040最大公約數之和

2021-07-10 09:00:46 字數 874 閱讀 8871

題目大意:

給出乙個n,求1-n這n個數,同n的最大公約數的和。比如:n = 6

1,2,3,4,5,6 同6的最大公約數分別為1,2,3,2,1,6,加在一起 = 15

input

1個數n(n <= 10^9)
output

公約數之和

思路:將n分解質因子,每個質因子貢獻的是多少,累加求和。每個質因子貢獻的次數可以用尤拉函式來求。若n%i==0 , 且n/i!=i,則ans += i*(euler(n/i)) + (n/i) * euler(i);

#include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

//#pragma comment(linker, "/stack:102400000,102400000")

#define maxn 1000005

#define mod 1000000007

#define mem(a , b) memset(a , b , sizeof(a))

#define ll long long

#define inf 100000000

int n;

int euler(int n)

}if(n > 1)

res -= res / n ;

return res;

}int main()

}cout << ans << endl;

}return 0;

}

51nod 1040 最大公約數之和

1040 最大公約數之和 rihkddd 基準時間限制 1 秒 空間限制 131072 kb 分值 80 難度 5級演算法題 給出乙個n,求1 n這n個數,同n的最大公約數的和。比如 n 6 1,2,3,4,5,6 同6的最大公約數分別為1,2,3,2,1,6,加在一起 15 input 1個數n ...

51Nod 1040 最大公約數之和

分析題目可以發現,兩個數gc d a,b x 則等價於gc d ax bx 1,問題就可以轉化為滿足gc d nx ix 1的i的個數,對答案貢獻就是個數乘上gc d n,i 很容易可以想到尤拉函式,因為 n 是小於等於n的數中與n互質的數的數目,gc d nx ix 1的i的個數就等於 nx 那麼...

51Nod 1040 最大公約數之和

1040 最大公約數之和 給出乙個n,求1 n這n個數,同n的最大公約數的和。比如 n 6 1,2,3,4,5,6 同6的最大公約數分別為1,2,3,2,1,6,加在一起 15 input 1個數n n 10 9 實際上應該是n 10 18output 公約數之和input示例 6output示例 ...