hdu GuGuFishtion 6390 数论 欧拉函数

题目:http://acm.hdu.edu.cn/showproblem.php?pid=6390

直接开始证明:

我们设…………………………………….....…...............……………...(1)

…................................….…(2)

为什么是这样呢,因为我们知道

同理得到b的分解和的分解

我们会发现,虽然a和b的分解里可以有相等的部分,但是在里的也就是我们假设为的部分是不会有重复的,那么要由*得出也就是要去除重复部分,的重复部分就是a的和b的的重复部分;那么因为都是乘法,相同的部分就是最大公约数(因为每个都是素数也就是如果a和b的分解没有相同的数那么gcd(, )是不会大于1的);

由此我们开始继续对(2)的后续推论。

我先设,那么

也就是

(看了很多博客,就给了个易得,虽然说确实很简单但是对于我这个菜鸡就不友好了)



 这一部分的证明是看了这个大佬的博客的:http://www.cnblogs.com/H-Riven/p/9494391.html

(再提供给同样是数论萌新的人一篇文库【有需要的话】:https://wenku.baidu.com/view/542961fdba0d4a7302763ad5.html

(即在的情况下的数量)

那么我们实际上就是要求:,对于我们可以预处理得到。但是就没那么容易得到了;

现在题目就变成求对于,在的情况下有多少种方案;

这里我设的数量 (C*x表示x的倍数);即可以和HDU1695一样得到的结论

的数量

那么:

倒过来求的原因是因为,也就是我们可以知道最后一位的准确值,那么反过来就可以推到每个位置准确值了;

那么答案就已经出来了;又因为要求的,对于每个,是含有有除法的,所以这里要用除法逆元,因为每次的mod都是不同的,所以说每次都要得到逆元,因为一定会小于min(n,m);所以说每次打从1到 min(n,m)的表比单个值的计算快;

以下是代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int N=2e6+7;
 5 ll euler[N], inv[N]={1, 1}, F[N], P[N], n, m, mod, mins;
 6 void Euler(){///打欧拉表
 7     register int i, j;
 8     for(i=0; i<N; ++i){ euler[i]=i; }
 9     for(i=2; i<N; ++i){
10         if(euler[i]==i){
11             for(j=i; j<N; j+=i)
12                 euler[j]=euler[j]-euler[j]/i;
13         }
14     }
15 }
16 void Inv(){///打表求逆元
17     for(register int i=2; i<=mins; ++i){
18         inv[i]=(ll)(mod-mod/i)*inv[mod%i]%mod;
19     }
20 }
21 int main( ){
22     Euler();
23     int T;
24     register ll ans;
25     register int i, j;
26     scanf("%d", &T);
27     while(T--){
28         scanf("%I64d%I64d%I64d", &n, &m, &mod);
29         mins=min(n, m);
30         Inv();
31         for(i=1; i<=mins; ++i){
32             F[i]=(n/i)*(m/i)%mod;
33         }
34         for(i=mins; i>=1; --i){
35             P[i]=F[i];
36             for(j=2; j*i<=mins; ++j){
37                 P[i]-=P[i*j];
38                 if(P[i]<0){
39                     P[i]+=mod;
40                 }
41             }
42         }
43         ans=0;
44         for(i=1; i<=mins; ++i){
45             ans=(ans+(i*inv[euler[i]]%mod)*P[i]%mod)%mod;
46         }
47         printf("%I64d\n", ans);
48     }
49 }

拙劣的代码

原文地址:https://www.cnblogs.com/DCD112358/p/9494764.html

时间: 2024-08-01 12:46:56

hdu GuGuFishtion 6390 数论 欧拉函数的相关文章

HDU 4002 Find the maximum(数论-欧拉函数)

Find the maximum Problem Description Euler's Totient function, φ (n) [sometimes called the phi function], is used to determine the number of numbers less than n which are relatively prime to n . For example, as 1, 2, 4, 5, 7, and 8, are all less than

hdu 3501 Calculation 2 (欧拉函数)

题目 题意:求小于n并且 和n不互质的数的总和. 思路:求小于n并且与n互质的数的和为:n*phi[n]/2 . 若a和n互质,n-a必定也和n互质(a<n).也就是说num必定为偶数.其中互质的数成对存在.其和为n. 公式证明: 反证法:如果存在K!=1使gcd(n,n-i)=k,那么(n-i)%k==0而n%k=0那么必须保证i%k=0k是n的因子,如果i%k=0那么gcd(n,i)=k,矛盾出现; 所以先求出1--n-1 的和, 再用这个和 减去 上面公式求出来的值. 欧拉函数phi(m)

HDU 3501 Calculation 2(欧拉函数的应用)

HDU 3501 Calculation 2 大意:求1~n之间与n不互质的数的总和. 思路:欧拉函数的应用:先用欧拉函数求出与n互质的总数m,计算m个数的总和,用n的总和减去m的总和就是想要的结果. 1 #include <stdio.h> 2 #define LL __int64 3 4 int eular(int n){ 5 int ret = 1; 6 for(int i = 2; i*i <= n;i++) 7 if(n%i == 0){ 8 n /= i, ret *= i-

欧拉函数性质与求法 [数论][欧拉函数]

n的欧拉函数值用符号φ(n)表示 欧拉函数的定义是,对于一个正整数n,小于n且与n互质的数的数目(包括1,特殊地,φ(1)=1 ). 设p1,p2,p3,...,pr为n的全部r个质因数,则有φ(n)=n*(1-1/p1)*(1-1/p2)*(1-1/p3)*(1-1/p4)…..(1-1/pr). 显然,用这个方法来计算单个欧拉函数是可以求解的. 附上代码: 1 int get_phi(int x){ 2 int re=x; 3 for(int i=2;i*i<=x;i++) 4 if(x%i

hdu 2814 快速求欧拉函数

1 /** 2 大意: 求[a,b] 之间 phi(a) + phi(a+1)...+ phi(b): 3 思路: 快速求欧拉函数 4 **/ 5 6 #include <iostream> 7 #include <cstring> 8 using namespace std; 9 #define Max 3000000 10 11 long long phi[Max+5]; 12 int prime[Max/10]; 13 bool flag[Max+5]; 14 15 void

POJ 2154 Color(组合数学-波利亚计数,数论-欧拉函数,数论-整数快速幂)

Color Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7693   Accepted: 2522 Description Beads of N colors are connected together into a circular necklace of N beads (N<=1000000000). Your job is to calculate how many different kinds of th

hdu1395 数论 欧拉函数

hdu1395 数论   欧拉函数对于给出的每一个n 求最小正整数 x 满足 2^x mod n = 1 1.如果给出的n 是偶数或者 1 则一定无解2.如果是奇数 首先根据欧拉定理 我们可知 phi(n)一定是满足要求的 然后答案一定是 phi( i ) 的因数 然后我们就可以 O(sqrt(phi(i))的时间内 枚举每个因数 然后快速幂验证就行了 1 #include <bits/stdc++.h> 2 using namespace std ; 3 4 const double eps

GuGuFishtion HDU - 6390 (欧拉函数,容斥)

GuGuFishtion \[ Time Limit: 1500 ms\quad Memory Limit: 65536 kB \] 题意 给出定义\(Gu(a, b) = \frac{\phi(ab)}{\phi(a)\phi(b)}\) 求出\(\sum_{a=1}^{m}\sum_{b=1}^{n}Gu(a,b) (mod p)\) 思路 首先对于欧拉函数,我们知道欧拉函数的朴素式子为:\(\phi(n) = n*(1-\frac{1}{p1})*(1-\frac{1}{p2}) * ..

【数论-欧拉函数】HDU 3501 Calculation 2 ( 与n不互质的数的和 )

[题目链接]click here~ [题目大意]给定整数n,求与n不互质的数的和,最后mod1e9+7 [解题思路]我们利用欧拉函数和欧几里德定理,if  gcd(n,i)==1 ,则有 gcd(n,n-i)==1 ,可以知道 其中一个若为i则存在一个为n-i 那么二者之和为n  ,这样的一共有eular(n)/2对  故与n互质的所有数的和为 n*eular(n)/2 那么与n不互质的 数就是(n)*(n-1)/2-n*eular(n)/2 [source]2010 ACM-ICPC Mult