題目大意:
給出乙個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示例 ...