小L的珍珠挂饰

题目背景

小L通过泥萌的帮助,成功解决了牛栏的修建问题。奶牛们觉得主人非常厉害,于是再也不敢偷懒,母牛们奋力挤奶,生娃。子子孙孙无穷匮也!小L于是成为了一代富豪!

但是一直困扰小L的就是单身问题!小L经过长久的寻觅,小L终于找到了一个心仪的漂亮妹子。于是,小L打算在520那天给妹子一个惊喜!(虽然小L很节约,但是对妹子还是很阔绰的!)

题目描述

小L决定用K种珍珠为妹子做一串举世无双的珍珠垂饰。珍珠垂饰是由珍珠连接而成的,其长度可以认为就是珍珠垂饰上珍珠的个数。小L现在腰缠万贯,每种珍珠他都拥有N颗。根据将珍珠垂饰打开后珍珠不同的排列顺序可以区别不同种类的项链。现在,小L好奇自己可以组成多少种长度为1至N的不同的珍珠垂饰?当然,为显富有,每串珍珠垂饰都要必须由K种珍珠连成。 答案取模1234567891。

这一定难不倒聪明的你吧!如果你能帮小L解决这个问题,也许他会把最后的资产分给你1/4哦!

输入输出格式

输入格式:
输入包含多组数据。第一行是一个整数T,表示测试数据的个数。每组数据占一行,包含两个整数N和K,用一个空格隔开。

输出格式:
每组数据输出仅一行,包含一个整数,表示项链的种类数。

输入输出样例

输入样例#1:
2
2 1
3 2
输出样例#1:
2
8
说明

40 % :1<= N<= 100000, 0<= K<= 30

100% :T <= 10, 1<= N<= 1000000000, 0<= K<= 30

70%-100%:时限10ms

分析:一题数论题目,推推公式即可。

程序:

const
 mo=1234567891;
var
 t,i,c,d,j,g:longint;
 p:array[0..30]of int64;
 ans,f:int64;
function mid(i,j:longint):int64;
var p,q,o:int64;
begin
p:=i; o:=1;
while j>0 do
 begin
  if j mod 2=1 then o:=(o*p)mod mo;
  p:=(p*p)mod mo; j:=j div 2;
 end;
exit(o);
end;

function jc(i:longint):int64;
begin
 if i=1 then exit(c-d+1);
 exit((((mid(i,c+1)-mid(i,d))mod mo)*mid(i-1,mo-2)) mod mo);
end;

function dg(i,j:longint):int64;
begin
 exit((p[i]*mid((p[j]*p[i-j])mod mo,mo-2))mod mo);
end;

begin
 readln(t);
 p[0]:=1;
 for i:=1 to 30 do
  p[i]:=(p[i-1]*i)mod mo;
 for i:=1 to t do
  begin
   readln(c,d);
   g:=1; ans:=0;
    for j:=d downto 1 do
    begin
     ans:=(ans+jc(j)*g*dg(d,d-j))mod mo;
     g:=-g;
    end;
   while ans<0 do inc(ans,mo); writeln(ans); 
  end;
end.

版权声明:本文为liangzihao1原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。