共T 行,对于每一对N,M,输出1 至N!中与M!素质的数的数量对R 取模后的值
【样例】
输入样例(cash.in 的内容):
1 11
4 2
输出样例(cash.out 的内容):
1
【数据范围】
对于20%的数据, 1<=N,M<=10,T<=10
对于40%的数据, 1<=N,M<=10000
对于80%的数据, 1<=N,M<=1000000
对于100%的数据,1<=N,M<=10000000
山东省选08年第二轮第一天试题
N!*(小于M的质数减一之积)/(小于M的质数之积)
需要注意的是预处理10000000以内质数用一次循环,
i从i倍开始设为合数
测试数据
http://mail.qq.com/cgi-bin/ftnExs_download?k=253732389632cc9c361047271e33014c520702080103044c4c55540952560356571a065b5255195706010715080b04004e53560b5057070150520b0904333c63005641501f4155116371&t=exs_ftn_download&code=c728134c
program cash;
const
maxn=10000000;
var
t,r,n,m,i,j,k:longint;
ans:int64;
left,mix,om:array [0..maxn+1] of int64;
yes:array [0..maxn+1] of boolean;
function quick (x,y:int64):int64;
var
i:int64;
begin
if y=0 then exit(1);
if y=1 then exit(x mod r);
i:=quick(x,y div 2);
if y and 1 = 1 then exit(i * i mod r * x mod r)
else exit(i * i mod r);
end;
begin
assign(input,'cash.in');
reset(input);
assign(output,'cash.out');
rewrite(output);
read(t,r);
left[1]:=1;
for i:=2 to maxn do
left[i]:=left[i-1]*i mod r;
fillchar(yes,sizeof(yes),false);
for i:=2 to maxn do
if not yes[i] then
for j:=i to maxn div i do
yes[i*j]:=true;
mix[1]:=1;
for i:=2 to maxn do
begin
mix[i]:=mix[i-1];
if not yes[i] then mix[i]:=mix[i]*(i-1) mod r;
end;
om[1]:=1;
for i:=2 to maxn do
begin
om[i]:=om[i-1];
if not yes[i] then om[i]:=om[i]*i mod r;
end;
while t<>0 do
begin
dec(t);
read(n,m);
if m=1 then
begin
writeln(left[n]);
continue;
end;
if n=1 then
begin
writeln(1 mod r);
continue;
end;
writeln(left[n]*mix[m] mod r *quick(om[m],r-2) mod r);
end;
close(input);
close(output);
end.