题面:不互质的数
大秦 为你打开 题目传送门
备用题面
看不了题目的看下面喵!
求 $1\sim N-1$ 中与 $N$ 不互质的数的和并对 $1e9+7$ 取模。
思路
注意到 $k$ 与 $N$ 互质时,$N-k$ 也与 $N$ 互质,满足对称性,则利用类似等差数列求和的思路,可得 $n\times \varphi(n)/2$ 就是与 $N$ 互质的数的和,从总量减去即可。
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
| #include<bits/stdc++.h> using namespace std;
typedef long long ll;
typedef pair<int , int > pii; typedef unsigned long long ull;
namespace FastIO { template<typename T> inline T read(T& x) { x = 0; int f = 1; char ch; while (!isdigit(ch = getchar())) if (ch == '-') f = -1; while (isdigit(ch)) x = (x << 1) + (x << 3) + (ch ^ 48), ch = getchar(); x *= f; return x; } template<typename T, typename... Args> inline void read(T& x, Args &...x_) { read(x); read(x_...); return; } inline ll read() { ll x; read(x); return x; } }; using namespace FastIO;
const int P = 1000000007;
ll n;
inline void Input() { read(n); if(n == 0) return exit(0); }
inline void Work() { if(n == 1) { printf("0\n"); return ; } ll phi = n, m = n; for(ll i = 2; i * i <= n; i++) { if(n % i == 0) { phi = phi / i * (i - 1); while(n % i == 0) n /= i; } } if(n > 1) phi = phi / n * (n - 1); printf("%lld\n", ((m * (m - 1) / 2) - (phi * m / 2)) % P); }
int main() { int T = -1; while(T--) { Input(); Work(); } return 0; }
|