题面:不互质的数
大秦 为你打开 题目传送门
备用题面
看不了题目的看下面喵!
求 $1\sim N-1$ 中与 $N$ 不互质的数的和并对 $1e9+7$ 取模。
思路
注意到 $k$ 与 $N$ 互质时,$N-k$ 也与 $N$ 互质,满足对称性,则利用类似等差数列求和的思路,可得 $n\times \varphi(n)/2$ 就是与 $N$ 互质的数的和,从总量减去即可。
代码
| 12
 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;
 }
 
 |