题目描述

佳佳碰到了一个难题,请你来帮忙解决。

对于不定方程a1+a2+…+ak-1+ak=g(x),其中k≥2且k∈N,x是正整数,g(x)=x^x mod 1000(即x^x除以1000的余数),x,k是给定的数。我们要求的是这个不定方程的正整数解组数。

举例来说,当k=3,x=2时,分别为(a1,a2,a3)=(2,1,1)'(1,2,1),(1,1,2)。

输入输出格式

输入格式:

输入文件equation.in有且只有一行,为用空格隔开的两个正整数,依次为k,x。

输出格式:

输出文件equation.out有且只有一行,为方程的正整数解组数。

输入输出样例

输入样例#1:

3 2
输出样例#1:

3

说明

对于40%的数据,ans≤10^16;对于100%的数据,k≤100,x≤2^31-1,k≤g(x)。

_NOI导刊2010提高(01)

分析:考虑dp,设f[i][j]表示选了i个数,和为j的正整数解组数.很显然f[i][j]=∑f[i-1][j-kk],kk是i能够取到的数,答案是f[x^x % 1000][k].复杂度是三次方级别的,看有没有方方法来优化一下.单纯从dp上来看似乎是只能优化空间了,如果有公式就好了,类似青蛙过河一样。

其实问题可以变成我们要走k步,每一步走的距离任意,走的总距离要为x,求方案数,因为每一步走的距离任意,实际上我们只要把这k步分配到x中就好了.把x抽象成x个点,画在图上,就能发现走k步实际上是在x-1个间隔中找k-1个间隔,那么答案就是C(x-1,k-1).

因为k,x很大,所以要用到高精度,我用结构体写高精度总是出现奇怪的错误,以后还是用数组了.

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; long long k,x;
int f[][][]; long long qpow(long long a,long long b,int mod)
{
long long ans = ;
while (b)
{
if (b & )
ans = (ans * a) % mod;
a = (a * a) % mod;
b >>= ;
}
return ans;
} void add(int x,int y,int x1,int y1,int x2,int y2)
{
for (int i = ; i <= max(f[x1][y1][],f[x2][y2][]); i++)
{
f[x][y][i] += f[x1][y1][i] + f[x2][y2][i];
f[x][y][i + ] = f[x][y][i] / ;
f[x][y][i] %= ;
}
f[x][y][] = max(f[x1][y1][],f[x2][y2][]);
if (f[x][y][f[x][y][] + ])
f[x][y][]++;
} int main()
{
scanf("%lld%lld",&k,&x);
x = qpow(x,x,); for (int i = ; i < x; i++)
f[i][][] = f[i][][] = ; for (int i = ; i < x; i++)
for (int j = ; j < k; j++)
add(i,j,i-,j,i-,j-); for (int i = f[x-][k-][]; i >= ; i--)
printf("%d",f[x-][k-][i]);
printf("\n"); return ;
}

洛谷P1771 方程的解_NOI导刊2010提高(01)的更多相关文章

  1. P1771 方程的解_NOI导刊2010提高(01)

    P1771 方程的解_NOI导刊2010提高(01) 按题意用快速幂把$g(x)$求出来 发现这不就是个组合数入门题吗! $k$个人分$g(x)$个苹果,每人最少分$1$个,有几种方法? 根据插板法, ...

  2. 洛谷—— P1775 古代人的难题_NOI导刊2010提高(02)

    P1775 古代人的难题_NOI导刊2010提高(02) 题目描述 门打开了,里面果然是个很大的厅堂.但可惜厅堂内除了中央的一张羊皮纸和一支精致的石笔,周围几具骷髅外什么也没有.难道这就是王室的遗产? ...

  3. 方程的解_NOI导刊2010提高(01) 组合数

    题目描述 佳佳碰到了一个难题,请你来帮忙解决. 对于不定方程a1+a2+…+ak-1+ak=g(x),其中k≥2且k∈N,x是正整数,g(x)=x^x mod 1000(即x^x除以1000的余数), ...

  4. 洛谷——P1775 古代人的难题_NOI导刊2010提高(02)&& P1936 水晶灯火灵(斐波那契数列)

    P1775 古代人的难题_NOI导刊2010提高(02) P1936 水晶灯火灵 斐波那契数列 1.x,y∈[1…k],且x,y,k∈Z 2.(x^2-xy-y^2)^2=1 给你一个整数k,求一组满 ...

  5. 洛谷 P1807 最长路_NOI导刊2010提高(07) 题解

    P1807 最长路_NOI导刊2010提高(07) 题目描述 设G为有n个顶点的有向无环图,G中各顶点的编号为1到n,且当为G中的一条边时有i < j.设w(i,j)为边的长度,请设计算法,计算 ...

  6. 方程的解_NOI导刊2010提高

    方程的解 给定x,求\(a_1+a_2+...+a_k=x^x\ mod\ 1000\)的正整数解解的组数,对于100%的数据,k≤100,x≤2^31-1. 解 显然x是可以快速幂得到答案的,而该问 ...

  7. 洛谷 P1807 最长路_NOI导刊2010提高(07)

    最长路 #include <iostream> #include <cstdio> #include <cstring> #include <queue> ...

  8. 洛谷 P1807 最长路_NOI导刊2010提高(07)题解

    相当与一个拓扑排序的模板题吧 蒟蒻的辛酸史 题目大意:给你一个有向无环图,让你求出1到n的最长路,如果没有路径,就输出-1 思路:一开始以为是一个很裸的拓扑排序 就不看题目,直接打了一遍拓扑排序 然后 ...

  9. 洛谷P1807 最长路_NOI导刊2010提高(07)

    //拓扑排序求最长路 #include<bits/stdc++.h> #include<queue> using namespace std; const int INF=0x ...

随机推荐

  1. CentOS 7.2安装pip

    CentOS 7.2默认安装的python版本为python2.7.5,我的系统里面默认是没有安装pip 的,搜了下网上各路大侠的解决办法,如下: 使用yum安装python-pip,但是报错,说没有 ...

  2. jQuery中面向对象思想实现盒子内容切换

    这里主要是模拟小米官网中的首页的内容模块实现的主要动态效果 布局:采用了bootstrap框架进行布局,及其其中的字体图标 html: <!-- 内容 --> <div class= ...

  3. Thrift入门及Java实例演示【转】

    概述 Thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发.它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++.Java.Python.PHP.Ruby.Erlang.Perl.Ha ...

  4. 洛谷 P1507 NASA的食物计划

    题目背景 NASA(美国航空航天局)因为航天飞机的隔热瓦等其他安 全技术问题一直大伤脑筋,因此在各方压力下终止了航天 飞机的历史,但是此类事情会不会在以后发生,谁也无法 保证,在遇到这类航天问题时,解 ...

  5. SPICE-HTML5 鼠标指针BUG修复

    研究SPICE,找到了他们官方指定的HTML5客户端.下载下来用一下,发现跟网页VNC的水平差不多了.http://www.spice-space.org/page/Html5 服务端直接用QEMU起 ...

  6. Charles Petzold 编程界大师,世界顶级技术作家 《CODE》值得阅读

    <CODE>The Hidden Language of Computer Hardware and Software 从书内容的第一页开始就惊叹于作者的耐心和责任心 整本书以两个隔街对窗 ...

  7. 善用Object.defineProperty巧妙找到修改某个变量的准确代码位置

    我今天的工作又遇到一个难题.前端UI右下角这个按钮被设置为"禁用(disabled)"状态. 这个按钮的可用状态由属性enabled控制.我通过调试发现,一旦下图第88行代码执行完 ...

  8. varchar2(100 char)是什么意思

    最佳答案   varchar2(100 char)最长可以插入100个任意字符而varchar2(100)最长可以插入100个英文字符

  9. 数据库管理系统X

    大部分DBMS提供数据定义语言DDL(Data Definition Language)和数据操作语言DML(Data Manipulation Language),供用户定义数据库的模式结构与权限约 ...

  10. 测试常用的linux命令

    一.系统 1.halt:         关机   poweroff: 关机 2.reboot:     重启 二.处理目录和文件的命令 1.ll:     显示文件详细信息 ls:    显示文件目 ...