题意:

求小于n且不与n互素的正整数的和

思路:

若已知m与n互质,则n-m也与n互质 

那么,对于任何一个i与n互质,必然n-i也和n互质,所以Φ(n)必然是偶数(除了2)

所以从1到N与N互质的数的和为Φ(n)*n/2(2虽然不满足Φ(2)%2=0,但满足这个公式)

 

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
ll euler(ll n) {
ll ans = n;
for (int i = 2; i * i <= n; i++) {
if (n % i == 0) {
ans = ans / i * (i - 1);
while (n % i == 0) n /= i;
}
}
if (n > 1) {
ans = ans / n * (n - 1);
}
return ans;
}
int main() {
ll n;
cout << euler(2) << endl;
while (~scanf("%lld", &n) && n) {
printf("%lld\n", (n * (n - 1) / 2 - euler(n) * n / 2)%mod);
}
return 0;
}