UVA 11440 Help Mr. Tomisu 欧拉phi函数


欧拉phi函数的改进版.....


Time Limit: 7000MSMemory Limit: Unknown64bit IO Format: %lld & %llu

Submit Status

Description

Download as PDF

Problem D
Help Mr. Tomisu
Input: 
Standard Input

Output: Standard Output

 

After wasting a significant time of his life in problem-setting, Mr. Tomisu is now searching for glory: A glory that will make him famous like Goldbach and rich like Bill Gates :). And he has chosen the field of Number Theory as his prime interest. His creator did not make him very bright and so he needs your help to solve an elementary problem, using which he will begin his pursuit for glory!

 

Tomisu has come to know that finding out numbers having large prime factors are very important in cryptography. Given two integers N and M, he aims to count the number of integers x between 2 and N! (factorial N), having the property that all prime factors of x are greater than M.

 

Input

The input file contains at most 500 lines of inputs. Each line contains two integers N (1<N<10000001) and M (1≤M≤N and N-M≤100000). Input is terminated by a line containing two zeroes. This line should not be processed.

 

Output

For each line of input produce one line of output. This line contains the value T % 100000007 (Modulo 100000007 value of T). Here T is the total number of numbers between 1 and N! (factorial N) which have prime factors greater than M. 

 

Sample Input                                     Output for Sample Input

100 10

100 20

10000 9000

0 0

43274465

70342844

39714141


Problemsetter: Shahriar Manzoor

Special Thanks: Per Austrin

 

Source

Root :: AOAPC II: Beginning Algorithm Contests (Second Edition) (Rujia Liu) :: Chapter 10. Maths ::  Examples
Root :: Prominent Problemsetters ::  Shahriar Manzoor

Root :: AOAPC I: Beginning Algorithm Contests -- Training Guide (Rujia Liu) :: Chapter 2. Mathematics :: Number Theory ::  Exercises: Intermediate

Submit Status



/* ***********************************************
Author        :CKboss
Created Time  :2015年02月02日 星期一 16时13分33秒
File Name     :UVA11440.cpp
************************************************ */

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <cmath>
#include <cstdlib>
#include <vector>
#include <queue>
#include <set>
#include <map>

using namespace std;

typedef long long int LL;

const LL mod = 100000007LL ;
const int maxn = 10001000;

LL n,m;

bool vis[maxn];
LL phiac[maxn];

/// get prime
void getPRIME()
{
	memset(vis,true,sizeof(vis));
	vis[0]=vis[1]=false;
	for(int i=2;i*i<maxn;i++)
	{
		if(vis[i]==false) continue;
		for(int j=2*i;j<maxn;j+=i)
			vis[j]=false;
	}
}

void init()
{
	getPRIME();
	/// phiac[n]=phi[n!]
	phiac[1]=phiac[2]=1;
	for(int i=3;i<maxn;i++)
	{
		if(vis[i]==false) phiac[i]=(phiac[i-1]*i)%mod;
		else phiac[i]=(phiac[i-1]*(i-1))%mod;
	}
}

int main()
{
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);

	init();
	while(cin>>n>>m)
	{
		if(n==0&&m==0) break;
		LL temp = phiac[m];
		for(int i=m+1;i<=n;i++)
			temp =( temp * i )%mod;
		cout<<(temp-1+mod)%mod<<endl;
	}

    return 0;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值