Codevs P1654方程的解

Codevs P1654方程的解


题目描述 Description

佳佳碰到了一个难题,请你来帮忙解决。对于不定方程a1+a2+… +ak-1 +ak=g(x),其中k≥2且k ∈ N*,x是正整数,g(x) =xx mod 1000(即xx除以1000的余数),x,k是给定的数。我们要求的是这个不定方程的正整数解组数。举例来说,当k=3, x=2时,分别为(a1,a2,a3)=(2,1,1),(1,2,1),(1,1,2)。


输入输出


输入描述 Input Description

输人只有一行,为用空格隔开的两个正整数,依次为k,x。

输出描述 Output Description

输出只有一行,为方程的正整数解组数。

样例 Sample


样例输入 Sample Input

3 2

样例输出 Sample Output

3

数据范围及提示 Data Size & Hint

【数据范围】
对于40%的数据,ans ≤ 1016;
对于100%的数据,k≤ 100,x≤231一1,k ≤g (x)。

分析

因为要求正整数解,那么显然就是讲g[x]拆成g[x]个1,利用隔板法求得结果即c(g[x]-1,k-1);
快速幂求x^x mod 1000;
然后高精乘单精,高精除以单精即可

代码如下

program p1654;
type num=array[0..10000] of longint;
var k,x:int64;
    i:longint;
    f,ans:num;
function power(a,b:int64):longint;
var sum:int64;
begin
 sum:=1;
 a:=a mod 1000;
 while b<>0 do
  begin
   if b and 1=1 then sum:=(sum*a) mod 1000;
   b:=b>>1;
   a:=(a*a) mod 1000;
  end;
 exit(sum);
end;
function mutiply(x:longint):num;
var i:longint;
begin
 for i:=1 to f[0] do
  f[i]:=f[i]*x;
 for i:=1 to f[0] do
  begin
   f[i+1]:=f[i+1]+f[i] div 10;
   f[i]:=f[i] mod 10;
  end;
 while f[f[0]+1]>0 do
  begin
   inc(f[0]);
   f[f[0]+1]:=f[f[0]+1]+f[f[0]] div 10;
   f[f[0]]:=f[f[0]] mod 10;
  end;
 exit(f);
end;
function subtract(x:longint):num;
var rest,i:longint;
begin
 fillchar(subtract,sizeof(subtract),0);
 rest:=0;
 for i:=f[0] downto 1 do
  begin
   rest:=rest*10+f[i];
   subtract[i]:=rest div x;
   rest:=rest mod x;
  end;
 subtract[0]:=f[0];
 while (subtract[0]>0) and (subtract[subtract[0]]=0) do dec(subtract[0]);
 exit(subtract);
end;

function c(n,m:longint):num;
var i:longint;
begin
 f[0]:=1;
 f[1]:=1;
 for i:=n-m+1 to n do
  f:=mutiply(i);
 for i:=2 to m do
  f:=subtract(i);
 exit(f);
end;
begin
 readln(k,x);
 x:=power(x,x);
 ans:=c(x-1,k-1);
 for i:=ans[0] downto 1 do
  write(ans[i]);
end.

评测结果

运行结果
测试点#equation1.in 结果:AC 内存使用量: 364kB 时间使用量: 1ms
测试点#equation10.in 结果:AC 内存使用量: 368kB 时间使用量: 1ms
测试点#equation2.in 结果:AC 内存使用量: 364kB 时间使用量: 1ms
测试点#equation3.in 结果:AC 内存使用量: 368kB 时间使用量: 1ms
测试点#equation4.in 结果:AC 内存使用量: 368kB 时间使用量: 1ms
测试点#equation5.in 结果:AC 内存使用量: 368kB 时间使用量: 3ms
测试点#equation6.in 结果:AC 内存使用量: 368kB 时间使用量: 1ms
测试点#equation7.in 结果:AC 内存使用量: 364kB 时间使用量: 3ms
测试点#equation8.in 结果:AC 内存使用量: 364kB 时间使用量: 2ms
测试点#equation9.in 结果:AC 内存使用量: 368kB 时间使用量: 2ms

#


这里写图片描述


这里写图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值