HDU 5728 2016多校Contest 1 F题【数论,注意要mod】
2016-07-29 10:56
381 查看
参考如下几篇:http://blog.csdn.net/MikeZHW/article/details/51969072
http://blog.csdn.net/wust_zzwh/article/details/51966450 (重点)
http://blog.csdn.net/popoqqq/article/details/43951401
有几个公式要总结
![](https://img-blog.csdn.net/20140613151829390)
以及:
先了解两条性质,欧拉函数是积性函数;
(1)积性函数性质:F(m1*m2)=F(m1)*F(m2),当且近当gcd(m1,m2)=1时成立;
(2)
![](https://img-blog.csdn.net/20160720123915145?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
,其中p是n的素因子。这个用欧拉函数的素因子表达式很好证明。
上述引用自http://blog.csdn.net/wust_zzwh/article/details/51966450
PS:发现好多人数据跑出来结果不一样,都能AC?!
以下为数据:极限数据很多人RE?
2 100 5
123124 1241987 1298798
1 2 6
1 100 9
9000000 7004001 8000009
10000000 10000000 10000000
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <iostream>
using namespace std;
typedef long long LL;
const int maxn = 10000010;
const int mod = 1000000007;
int phi[maxn], sum[maxn];
void getfirst()
{
memset(phi, 0, sizeof(phi));
memset(sum, 0, sizeof(sum));
phi[1] = 1;
for (int i = 2; i < maxn; ++ i)
if (!phi[i])
for (int j = i; j < maxn; j += i)
{
if (!phi[j]) phi[j] = j;
phi[j] = phi[j] / i * (i - 1);
}
for (int i = 1; i < maxn; ++ i)
sum[i] = (sum[i - 1] + phi[i]) % mod;
}
LL f(int n, int m)
{
if (n == 0)
{
cout<<"@@"<<endl;
return 0;
}
if (m == 0) return 0;
if (n == 1) return sum[m];
if (m == 1) return phi
;
if (phi
== n - 1) return ((LL)phi
* f(1, m) % mod+ f(n, m / n)) % mod; //判断是否是素数,优先判断避免总是循环
for (int i = 2; i * i <= n; ++ i)
if (!(n % i)) return ((LL)phi[i] * f(n/i, m) % mod+ f(n, m / i)) % mod;
}
LL powMod( LL a , LL b , LL p )//a^b % p
{
LL r = 1 ;
a %= p ;
while( b )
{
if( b&1 ) r = r*a%p ;
b >>= 1 ;
a = a*a%p ;
}
return r ;
}
LL gg(LL k, LL p)
{
if (p == 1) return 0;
if (p == 2) return k & 1;
return powMod(k, gg(k, phi[p]) + phi[p], p);
}
int main()
{
getfirst();
int n, m, p;
while (cin >> n >> m >> p)
{
LL k = f(n, m);
printf("%lld\n", gg(k, p));
}
return 0;
}
http://blog.csdn.net/wust_zzwh/article/details/51966450 (重点)
http://blog.csdn.net/popoqqq/article/details/43951401
有几个公式要总结
以及:
先了解两条性质,欧拉函数是积性函数;
(1)积性函数性质:F(m1*m2)=F(m1)*F(m2),当且近当gcd(m1,m2)=1时成立;
(2)
,其中p是n的素因子。这个用欧拉函数的素因子表达式很好证明。
上述引用自http://blog.csdn.net/wust_zzwh/article/details/51966450
PS:发现好多人数据跑出来结果不一样,都能AC?!
以下为数据:极限数据很多人RE?
2 100 5
123124 1241987 1298798
1 2 6
1 100 9
9000000 7004001 8000009
10000000 10000000 10000000
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <iostream>
using namespace std;
typedef long long LL;
const int maxn = 10000010;
const int mod = 1000000007;
int phi[maxn], sum[maxn];
void getfirst()
{
memset(phi, 0, sizeof(phi));
memset(sum, 0, sizeof(sum));
phi[1] = 1;
for (int i = 2; i < maxn; ++ i)
if (!phi[i])
for (int j = i; j < maxn; j += i)
{
if (!phi[j]) phi[j] = j;
phi[j] = phi[j] / i * (i - 1);
}
for (int i = 1; i < maxn; ++ i)
sum[i] = (sum[i - 1] + phi[i]) % mod;
}
LL f(int n, int m)
{
if (n == 0)
{
cout<<"@@"<<endl;
return 0;
}
if (m == 0) return 0;
if (n == 1) return sum[m];
if (m == 1) return phi
;
if (phi
== n - 1) return ((LL)phi
* f(1, m) % mod+ f(n, m / n)) % mod; //判断是否是素数,优先判断避免总是循环
for (int i = 2; i * i <= n; ++ i)
if (!(n % i)) return ((LL)phi[i] * f(n/i, m) % mod+ f(n, m / i)) % mod;
}
LL powMod( LL a , LL b , LL p )//a^b % p
{
LL r = 1 ;
a %= p ;
while( b )
{
if( b&1 ) r = r*a%p ;
b >>= 1 ;
a = a*a%p ;
}
return r ;
}
LL gg(LL k, LL p)
{
if (p == 1) return 0;
if (p == 2) return k & 1;
return powMod(k, gg(k, phi[p]) + phi[p], p);
}
int main()
{
getfirst();
int n, m, p;
while (cin >> n >> m >> p)
{
LL k = f(n, m);
printf("%lld\n", gg(k, p));
}
return 0;
}
相关文章推荐
- (HDU 5728)2016 Multi-University Training Contest 1 PowMod(数论)
- HDU 5726 2016多校Contest 1 D题【好玩题,注意PE,和map初始化】
- 欧拉定理——PowMod ( HDU 5728 )(2016 Multi-University Training Contest 1 1006)
- 【HDU5728 2016 Multi-University Training Contest 1F】【数论+迭代 欧拉函数线性筛+积性递归】PowMod 欧拉函数积性性质+无穷幂迭代
- HDU 5962 2016 多校合练Contest 3 Teacher Bo
- hdu-5728 PowMod(数论)
- hdu 5728 PowMod 数论
- HDU 5728 PowMod(数论+递归)
- HDU 5731 2016多校Contest 1 F题【轮廓线DP+容斥原理】
- 2016多校4 hdu 5768 Lucky7 数论+容斥原理
- HDU 5730 2016多校Contest 1 G题【CDQ分治和FFT模板】
- HDU 5727 2016多校Contest 1 E题【暴力,STL应用,匈牙利算法,小心函数返回值别忘记写初始化!】
- HDU 5725 2016多校Contest 1 C题【gets比getchar更快!!思维题】
- hdu 4398 多校联合赛 第九场 X mod f(x) 数论
- HDU 5723 2016多校Contest 1 A题【细节:MST构边要小心】
- HDU 5728 PowMod(数论,欧拉函数的各种性质)
- HDU 5732 2016多校Contest 1 Subway【找树的重心,判断树的同构】
- 2016 Multi-University Training Contest 1 1004 hdu 5726 二分+RMQ
- HDU 5347 MZL's chemistry (2015 Multi-University Training Contest 5 2015多校联合)
- HDU 5402 Travelling Salesman Problem (2015 Multi-University Training Contest 9 2015多校联合)