您的位置:首页 > 其它

UVa 11440 (欧拉函数) Help Tomisu

2015-01-02 21:15 363 查看
题意:

给出N和M,统计区间x ∈ [2, N!],x满足所有素因子都大于M的x的个数。

分析:

首先将问题转化一下,所有素因子都大于M 等价于 这个数与M!互素

对于k大于M!,k与M!互素等价于 k % M! 与 M!互素

所以我们可以求出φ(M!)(φ为欧拉函数) 然后乘以N! / M!,最后答案再减一(因为是从2开始统计的)

欧拉函数的公式为

#include <cstdio>
#include <cmath>

const int maxn = 10000000 + 10;
const int MOD = 100000007;
int phifac[maxn];
bool vis[maxn];

void sieve(int n)
{
int m = sqrt(n + 0.5);
for(int i = 2; i <= m; ++i) if(!vis[i])
for(int j = i*i; j <= n; j += i)
vis[j] = true;
}

int main()
{
sieve(10000000);
phifac[1] = phifac[2] = 1;
for(int i = 3; i <= 10000000; ++i)
phifac[i] = (long long) phifac[i-1] * (vis[i] ? i : i-1) % MOD;

int n, m;
while(scanf("%d%d", &n, &m) == 2)
{
if(n == 0 && m == 0) break;
int ans = phifac[m];
for(int i = m+1; i <= n; ++i) ans = (long long)ans * i % MOD;
printf("%d\n", (ans-1+MOD)%MOD);
}

return 0;
}


代码君
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: