HDU 3970 Harmonious Set 容斥欧拉函数

链接

题解:www.cygmasot.com/index.php/2015/08/17/hdu_3970

给定n

求连续整数[0,n), 中任意选一些数使得选出的数和为n的倍数的方法数

。。。并不会如何递推。。

思路:

然后这是公式:点击打开链接

a(n) = 1/n * sum_{d divides n and d is odd} 2^(n/d) * phi(d).

d最大是n,也就是1e9,要计算1e9的phi,所以容斥来算phi.

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <vector>
#include <string>
#include <time.h>
#include <math.h>
#include <iomanip>
#include <queue>
#include <stack>
#include <set>
#include <map>
const int inf = 1e9;
const double eps = 1e-8;
const double pi = acos(-1.0);
template <class T>
inline bool rd(T &ret) {
	char c; int sgn;
	if (c = getchar(), c == EOF) return 0;
	while (c != '-' && (c<'0' || c>'9')) c = getchar();
	sgn = (c == '-') ? -1 : 1;
	ret = (c == '-') ? 0 : (c - '0');
	while (c = getchar(), c >= '0'&&c <= '9') ret = ret * 10 + (c - '0');
	ret *= sgn;
	return 1;
}
template <class T>
inline void pt(T x) {
	if (x < 0) { putchar('-'); x = -x; }
	if (x > 9) pt(x / 10);
	putchar(x % 10 + '0');
}
using namespace std;
const int N = 1e5 + 10;
const int mod = 1e9 + 7;
typedef long long ll;
typedef pair<int, int> pii;
int Pow(int x, int y){//快速幂
	int ans = 1;
	while (y){
		if (y & 1)ans = (ll)ans*x%mod;
		y >>= 1;
		x = (ll)x*x%mod;
	}
	return ans;
}
int prime[N], primenum;//素数表
void PRIME(int Max_Prime){
	primenum = 0;
	prime[primenum++] = 2;
	for (int i = 3; i <= Max_Prime; i += 2)
	for (int j = 0; j<primenum; j++)
	if (i%prime[j] == 0)break;
	else if (prime[j]>sqrt((double)i) || j == primenum - 1)
	{
		prime[primenum++] = i;
		break;
	}
}
void add(int &x, int y){ x += y; if (x >= mod)x -= mod; }//加法
void go(int x, vector<int>&Pri, vector<int>&Num){//分解质因数
	Pri.clear(); Num.clear();
	while (!(x & 1))x >>= 1;
	for (int i = 1; (ll)prime[i] * prime[i] <= x; i++){
		if (x%prime[i])continue;
		Pri.push_back(prime[i]);
		Num.push_back(0);
		while (x%prime[i] == 0)x /= prime[i], Num[Num.size() - 1]++;
	}
	if (x != 1 && (x&1))Pri.push_back(x), Num.push_back(1);
}
vector<int>_pri, _num;
void cal(int id, int mul, int siz, int sor, int &now){//容斥算欧拉函数
	if (id == _pri.size()){
		if (mul == 1)return;
		if (siz & 1)now += sor / mul;
		else now -= sor / mul;
		return;
	}
	cal(id + 1, mul, siz, sor, now);
	cal(id + 1, mul*_pri[id], siz + 1, sor, now);
}
int phi(int x){
	if (x == 1)return 1;
	go(x, _pri, _num);
	int now = 0;
	cal(0, 1, 0, x, now);
	return x - now;
}
int ans, n;
vector<int>pri, num;
void dfs(int id, int d){
	if (id == pri.size())
	{
		add(ans, (ll)Pow(2, n / d) * phi(d) % mod);
		return;
	}
	for (int i = 0; i <= num[id]; i++){
		dfs(id + 1, d);
		d *= pri[id];
	}
}
int main(){
	PRIME(1e5);
	int T; rd(T);
	while (T--){
		rd(n);
		go(n, pri, num);
		ans = 0;
		dfs(0, 1);
		pt((ll)ans*Pow(n, mod - 2) % mod); puts("");
	}
	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-18 02:03:24

HDU 3970 Harmonious Set 容斥欧拉函数的相关文章

HDU 1286 找新朋友(欧拉函数模板)

HDU 1286 找新朋友 题意:中文题. 思路:欧拉函数的纯模板题,没什么好说的,主要是理解欧拉函数的意义. 在数论,对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目.此函数以其首名研究者欧拉命名,它又称为Euler's totient function.φ函数.欧拉商数等. 例如φ(8)=4,因为1,3,5,7均和8互质.   ----by度娘. #include <stdio.h> int eular(int n){ int ret = 1; for(int i = 2; i*

HDU 4002 Find the maximum (欧拉函数-积性函数的性质(2011年大连赛区网络赛第二题)

[题目链接]:click here~~ [题目大意]: 给出一个整数n,求一个数x,x在1到n之间,并且x/φ(x)最大(其中φ(x)为x的欧拉函数). [思路]: 由欧拉函数为积性函数,即:如果 则有: 且: 则有: 要使f(x)最大,须使x含尽量多的不同素数因子. 代码: /* * Problem: HDU No.4002 * Running time: 1700MS * Complier: java * Author: javaherongwei * Create Time: 0:08 2

hdu 4983 Goffi and GCD(欧拉函数)

Problem Description Goffi is doing his math homework and he finds an equality on his text book: gcd(n−a,n)×gcd(n−b,n)=nk. Goffi wants to know the number of (a,b) satisfy the equality, if n and k are given and 1≤a,b≤n. Note: gcd(a,b) means greatest co

HDU 4983 Goffi and GCD(欧拉函数模板)

Problem Description: Goffi is doing his math homework and he finds an equality on his text book: gcd(n−a,n)×gcd(n−b,n)=n^k. Goffi wants to know the number of (a,b) satisfy the equality, if n and k are given and 1≤a,b≤n. Note: gcd(a,b) means greatest

HDU - 1286 找新朋友(欧拉函数)解题

找新朋友 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 13024    Accepted Submission(s): 6941 Problem Description 新年快到了,"猪头帮协会"准备搞一个聚会,已经知道现有会员N人,把会员从1到N编号,其中会长的号码是N号,凡是和会长是老朋友的,那么该会员的号码肯定和N有

HDU 6390 GuGuFishtion(莫比乌斯反演 + 欧拉函数性质 + 积性函数)题解

题意: 给定\(n,m,p\),求 \[ \sum_{a=1}^n\sum_{b=1}^m\frac{\varphi(ab)}{\varphi(a)\varphi(b)}\mod p \] 思路: 由欧拉函数性质可得:\(x,y\)互质则\(\varphi(xy)=\varphi(x)\varphi(y)\):\(p\)是质数则\(\varphi(p^a)=(p-1)^{a-1}\).因此,由上述两条性质,我们可以吧\(a,b\)质因数分解得到 \[ \begin{aligned} \sum_{

bestcode#6—1003 HDU 4983 Goffi and GCD 【欧拉函数】

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4983 题目大意:给出n和k,求出满足条件 gcd(n?a,n)×gcd(n?b,n)=nk. 的a和b. 首先可以得到的是gcd(n,x)< n 的,所以当k大于2时是无解的,当k等于2时,a=n,b=n才能得到n^2,只有一组. 主要是n=1的情况. 最开始做这个题目的时候是这样想的.先把一个数分为质因数的形式. /*========================================

hdu 6390 欧拉函数+容斥(莫比乌斯函数) GuGuFishtion

http://acm.hdu.edu.cn/showproblem.php?pid=6390 题意:求一个式子 题解:看题解,写代码 第一行就看不出来,后面的sigma公式也不会化简.mobius也不会 就自己写了个容斥搞一下(才能维持现在的生活) //别人的题解https://blog.csdn.net/luyehao1/article/details/81672837 #include <iostream> #include <cstdio> #include <cstr

hdu 1695 GCD 欧拉函数+容斥

题意:给定a,b,c,d,k x属于[1 , c],y属于[1 , d],求满足gcd(x,y)=k的对数.其中<x,y>和<y,x>算相同. 思路:不妨设c<d,x<=y.问题可以转化为x属于[1,c / k ],y属于[1,d/k ],x和y互质的对数. 那么假如y<=c/k,那么对数就是y从1到c/k欧拉函数的和.如果y>c/k,就只能从[ c/k+1 , d ]枚举,然后利用容斥.详见代码: /****************************