BZOJ 2818

来源:互联网 发布:网络电话卡是什么 编辑:程序博客网 时间:2024/06/01 08:13
#include <cstdio>#include <algorithm>#include <cstring>using namespace std;typedef long long ll;const ll Maxn = 10000900;ll prime[Maxn], phi[Maxn], tot;bool check[Maxn];ll n, ans;void Q_Prime(){phi[1] = 1;for(ll i = 2; i <= n; i++){if(!check[i]) prime[++tot] = i, phi[i] = i-1;for(ll j = 1; j <= tot; j++){if(i * prime[j] > n) break;check[i * prime[j]] = 1;if(i % prime[j] == 0){phi[i * prime[j]] = phi[i] * prime[j];break;}else phi[i * prime[j]] = phi[i] * (prime[j] - 1);}}}int main(){//计算出n以内的素数和互质数//因为gcd(x, y)=p(素数), 所以 gcd(x/p, y/p) == 1//所以,x/p和y/p互质,转而成为求max(x/p, y/p)以内的互质数//然而这样写T掉了,考虑前缀和处理,访问n/prime[j]之前所有的有效值ACscanf("%lld",&n);Q_Prime();// prllf("tot=%d\n",tot);for(ll i = 1; i <= n; i++) phi[i] += phi[i-1];for(ll i = 1; i <= tot; i++)ans += phi[n / prime[i]];printf("%lld",ans * 2 - tot);return 0;}

原创粉丝点击