赞
踩
题意: 对于任意三元组{(a,b,c)|a+b+c<n},计算lcm(c,gcd(a,b))的累和
思路:首先想到的是枚举a,b,计算c,暴力出结果,但是n^2的时间复杂度让人望而却步,因此我们转换枚举对象,枚举gcd(a,b),那么如何计算出c?加一层枚举(调和级数),枚举a与b的和,为gcd(a,b) 的倍数,那么问题就转化成了,在a与b的和一定的情况下,计算gcd(a,b)一定值的a,b个数,我们将a设为x,b设为k(a+b的和)-x
有如下转换gcd(x,k-x)==g(a,b的最大公约数)==>gcd(x/g,(k-x)/g)==1==>gcd(x/g,k/g)==1,因此,题目变成了求小于k/g的与其互质的数量,即phi[k/j]
欧拉函数求解
- #include<iostream>
- #include<cstring>
- #include<cstdio>
- #include<queue>
- #include<map>
- #include<set>
- #include<vector>
- #include<algorithm>
- #include<string>
- #include<bitset>
- #include<cmath>
- #include<array>
- #include<atomic>
- #include<sstream>
- #include<stack>
- #include<iomanip>
- //#include<bits/stdc++.h>
-
- //#define int ll
- #define pb push_back
- #define endl '\n'
- #define x first
- #define y second
- #define Endl endl
- #define pre(i,a,b) for(int i=a;i<=b;i++)
- #define rep(i,b,a) for(int i=b;i>=a;i--)
- #define si(x) scanf("%d", &x);
- #define sl(x) scanf("%lld", &x);
- #define ss(x) scanf("%s", x);
- #define YES {puts("YES");return;}
- #define NO {puts("NO"); return;}
- #define all(x) x.begin(),x.end()
-
- using namespace std;
-
- typedef long long ll;
- typedef unsigned long long ull;
- typedef pair<int, int> PII;
- typedef pair<int, PII> PIII;
- typedef pair<char, int> PCI;
- typedef pair<int, char> PIC;
- typedef pair<double, double> PDD;
- typedef pair<ll, ll> PLL;
- const int N = 200010, M = 2 * N, B = N, MOD = 1000000007;
- const int INF = 0x3f3f3f3f;
- const ll LLINF = 0x3f3f3f3f3f3f3f3f;
-
- int dx[4] = { -1,0,1,0 }, dy[4] = { 0,1,0,-1 };
- int n, m, k;
- int phi[N];
- int primes[N], countNum;
- bool st[N];
-
- ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a; }
- ll lowbit(ll x) { return x & -x; }
- ll qmi(ll a, ll b, ll mod) {
- ll res = 1;
- while (b) {
- if (b & 1) res = res * a % mod;
- a = a * a % mod;
- b >>= 1;
- }
- return res;
- }
-
- inline void init() {}
-
- void get_phi(int n)
- {
- pre(i, 2, n)
- {
- if (!st[i]) { primes[countNum++] = i; phi[i] = i - 1; }
- for (int j = 0; primes[j]<=n/i; j++)
- {
- st[i * primes[j]] = true;
- if (i % primes[j] == 0) {
- phi[i * primes[j]] = phi[i] * primes[j];
- break;
- }
- phi[i * primes[j]] = phi[i] * (primes[j] - 1);
- }
- }
- }
-
- ll lcm(ll a, ll b)
- {
- return a * b / gcd(a, b);
- }
-
- void slove()
- {
- cin >> n;
- ll ans = 0;
- get_phi(n);
-
- pre(g, 1, n)
- {
- for (int ab = g; ab < n; ab += g)
- {
- int c = n - ab;
- ans = (ans+(lcm(c, g) * phi[ab / g])%MOD)%MOD;
- }
- }
- cout << ans << Endl;
- }
-
- signed main()
- {
- int _;
- //si(_);
- _ = 1;
- init();
- while (_--)
- {
- slove();
- }
- return 0;
- }
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。