方程的解_NOI导刊2010提高
给定x,求\(a_1+a_2+...+a_k=x^x\ mod\ 1000\)的正整数解解的组数,对于100%的数据,k≤100,x≤2^31-1。
解
显然x是可以快速幂得到答案的,而该问题显然是组合计数的问题,换一种解释即\(b=x^x\)个相同的数能怎样放进k个有标号盒子。
思路一
而无法解决无标号放入有标号。于是逆向思维,把有标号盒子放入无标号\(b\)个数,有标号盒子可以重复放,无标号$b数个只能被放一次,因为是正整数的缘故,所以盒子必须保证放过,故事先构造放满,再套用可重组合公式,有
\]
思路二
注意到组合问题很难解决,故考虑排列,而这又是划分问题,故考虑全排列划分模型,即有k-1个0与b个1进行全排列,0去划分1,但是注意到要的是正整数解,于是0之间必须有1,于是事先填好1,有
\]
得到公式后根据所得条件按质因数分解型的阶乘高精处理即可。
参考代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#define il inline
#define ri register
#define yyb 1000
using namespace std;
struct lll{
short num[5000];
il lll(){num[0]=1;}
il void clear(){memset(num,0,sizeof(num)),num[0]|=true;}
template<class free>
il void operator=(free x){
num[0]=0;
while(x)num[++num[0]]=x%10,x/=10;
}
il lll operator*(lll x){
lll y;y.clear();
for(ri int i(1),j,k;i<=num[0];++i){
k=0;
for(j=1;j<=x.num[0];++j)
y.num[i+j-1]+=num[i]*x.num[j]+k,
k=y.num[i+j-1]/10,y.num[i+j-1]%=10;
y.num[i+x.num[0]]+=k;
}y.num[0]=num[0]+x.num[0];
while(!(y.num[y.num[0]])&&y.num[0]>1)--y.num[0];
return y;
}template<class free>
il lll operator^(free y){
lll x(*this),ans;ans=1;
while(y){
if(y&1)ans=ans*x;
x=x*x,y>>=1;
}return ans;
}
il void print(){
for(ri int i(num[0]);i;--i)putchar(num[i]+48);
}
};
lll xdk[250];
bool check[1100];
int prime[250],sp[250],tot;
il int pow(int,int);
il void c(int,int),sieve(int);
int main(){
int k,x;
scanf("%d%d",&k,&x),x=pow(x%yyb,x);
sieve(x-1),c(x-1,k-1);
return 0;
}
il void sieve(int n){
for(ri int i(2),j;i<=n;++i){
if(!check[i])prime[++tot]=i,xdk[tot]=i;
for(j=1;j<=tot&&prime[j]*i<=n;++j){
check[i*prime[j]]|=true;
if(!(i%prime[j]))break;
}
}
}
il void c(int n,int r){
if(n<r)return (void)(puts("0"));
int i,j;lll ans;ans=1;
for(i=1;i<=tot;++i)
for(j=n;j;j/=prime[i])sp[i]+=j/prime[i];
for(i=1;i<=tot;++i)
for(j=r;j;j/=prime[i])sp[i]-=j/prime[i];
for(i=1;i<=tot;++i)
for(j=n-r;j;j/=prime[i])sp[i]-=j/prime[i];
for(i=1;i<=tot;++i)ans=ans*(xdk[i]^sp[i]);ans.print();
}
il int pow(int x,int y){
int ans(1);while(y){
if(y&1)ans=ans*x%yyb;
x=x*x%yyb;y>>=1;
}return ans;
}
方程的解_NOI导刊2010提高的更多相关文章
- P1771 方程的解_NOI导刊2010提高(01)
P1771 方程的解_NOI导刊2010提高(01) 按题意用快速幂把$g(x)$求出来 发现这不就是个组合数入门题吗! $k$个人分$g(x)$个苹果,每人最少分$1$个,有几种方法? 根据插板法, ...
- 方程的解_NOI导刊2010提高(01) 组合数
题目描述 佳佳碰到了一个难题,请你来帮忙解决. 对于不定方程a1+a2+…+ak-1+ak=g(x),其中k≥2且k∈N,x是正整数,g(x)=x^x mod 1000(即x^x除以1000的余数), ...
- 洛谷P1771 方程的解_NOI导刊2010提高(01)
题目描述 佳佳碰到了一个难题,请你来帮忙解决. 对于不定方程a1+a2+…+ak-1+ak=g(x),其中k≥2且k∈N,x是正整数,g(x)=x^x mod 1000(即x^x除以1000的余数), ...
- 洛谷 P1777 帮助_NOI导刊2010提高(03) 解题报告
P1777 帮助_NOI导刊2010提高(03) 题目描述 Bubu的书架乱成一团了!帮他一下吧! 他的书架上一共有n本书.我们定义混乱值是连续相同高度书本的段数.例如,如果书的高度是30,30,31 ...
- 洛谷—— P1775 古代人的难题_NOI导刊2010提高(02)
P1775 古代人的难题_NOI导刊2010提高(02) 题目描述 门打开了,里面果然是个很大的厅堂.但可惜厅堂内除了中央的一张羊皮纸和一支精致的石笔,周围几具骷髅外什么也没有.难道这就是王室的遗产? ...
- P1799 数列_NOI导刊2010提高(06)
P1799 数列_NOI导刊2010提高(06)f[i][j]表示前i个数删去j个数得到的最大价值.if(i-j==x) f[i][j]=max(f[i][j],f[i-1][j]+1); else ...
- 【洛谷】【堆】P1801 黑匣子_NOI导刊2010提高(06)
[题目描述:] Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个Black Box要处理一串命令. 命令只有两 ...
- P1776 宝物筛选_NOI导刊2010提高(02)&& 多重背包二进制优化
多重背包, 要求 \(N\log N\) 复杂度 Solution 众所周和, \(1-N\) 之内的任何数可以由 \(2^{0}, 2^{1}, 2^{2} ... 2^{\log N}, N - ...
- P1801 黑匣子_NOI导刊2010提高(06)
P1801 黑匣子_NOI导刊2010提高(06) 题目描述 Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个 ...
随机推荐
- Docker容器中安装vim
我在docker中安装了jexus.使用vim编辑default配置文件的时候提示 vim: command not found 原因是docker中没有安装vim命令 如果你直接输入 apt-ge ...
- FB面经Prepare: Friends Recommendation
有个getFriend() API, 让你推荐你的朋友的朋友做你的朋友,当然这个新朋友不能是你原来的老朋友 package fb; import java.util.*; public class R ...
- Hadoop多租户架构配置
cloudera manager 进到cluster里面,点击Dynamic Resource Pools,没做任何配置默认情况下,资源池里有个default资源组 hadoop jar /usr/l ...
- js左右大小变化
点左边左边变大.点右边右边大左边小 <style type="text/css"> *{ margin:0px auto; padding:0px; } #wai{ w ...
- Unity3D判断当前所在平台
Unity3D是一个跨平台的开发工具,支持的平台五花八门,常常开发一款游戏要发布到不同的平台,在不同的平台上会使用不同的代码,难道要我们各平台分别使用一套代码,单独编译一次吗?当然不用了,呵呵. ...
- 使用Redux DevTools浏览器插件调试redux
与redux的Devtools模块不同,该工具主要依赖浏览器插件完成.模式也比Devtools简单点. step1 下载插件 Chrome地址(360极速模式也可以用): https://chrome ...
- ansible批量管理
编写批量安装脚本 [root@m01 scripts]# vim install.sh for ip in $* do echo "=======start install to $ip = ...
- IO流(三)
五.Java序列化 概述 Java序列化是指把Java对象转换为字节序列的过程 Java反序列化是指把字节序列恢复为Java对象的过程 当两个Java进程进行通信时,发送方需要把这个Java对象转换为 ...
- javascript数组方法
[声明一个数组]var a=[1,2,3]; [定义数组的长度]var a=new Array(2); [连接数组]数组1.concat(数组2,数组3) [将数组转换为字符串,可自定连接符]arr. ...
- linux目录结构特点
#####linux目录结构特点一切从根开始linx中每个设备可以挂载在任何目录上面磁盘/设备/分区没有挂载 无法使用 举例-linux下面使用光盘###1.把光盘放入到光驱中 ###2.linux中 ...