vijosP1371 方程的解
2015-10-14 09:03
232 查看
vijosP1371 方程的解
链接:https://vijos.org/p/1371
【思路】
组合公式+快速幂+高精单精。
求x^x %1000:因为x最大为2^31-1所以用快速幂在O(logx)的时间内求解g。
安排剩下的k个数:C(g-1,k-1) 相当于把g个数划分到k个不可空的集合中的数目,依旧可以看作插挡板。
考虑这类题目我们可以先从简单情况入手写一个能够处理简单数据的代码,然后再考虑优化的问题。
【代码】
链接:https://vijos.org/p/1371
【思路】
组合公式+快速幂+高精单精。
求x^x %1000:因为x最大为2^31-1所以用快速幂在O(logx)的时间内求解g。
安排剩下的k个数:C(g-1,k-1) 相当于把g个数划分到k个不可空的集合中的数目,依旧可以看作插挡板。
考虑这类题目我们可以先从简单情况入手写一个能够处理简单数据的代码,然后再考虑优化的问题。
【代码】
#include<iostream> using namespace std; typedef long long LL; struct Bign{ int len,N[10001]; }; LL pow(int x) { LL tmp=x,ans=1; while(x) { if(x&1) ans=(ans*tmp)%1000; tmp=(tmp*tmp)%1000; x>>=1; } return ans; } void multi(Bign& a,int x) { for(int j=0;j<a.len;j++) a.N[j] *= x; int i=0; while(i<a.len || a.N[i]>10) { a.N[i+1] += a.N[i]/10; a.N[i] %= 10; i++; //i++ } if(a.N[i]) a.len=i+1; //判断 else a.len=i; } void div(Bign& a,int x) { for(int i=a.len-1;i>0;i--) { //由高位到低位 a.N[i-1] += a.N[i]%x*10; a.N[i] /= x; } a.N[0]/=x; //最后一位 while(a.N[a.len-1]==0) a.len--; //删除前导0 } int main() { int k,x; cin>>k>>x; LL g=pow(x); //x^x g--; k--; Bign ans; ans.len=1,ans.N[0]=1; for(int i=1;i<=k;i++) { multi(ans,g-k+i); div(ans,i); } for(int i=ans.len-1;i>=0;i--) cout<<ans.N[i]; return 0; }
相关文章推荐
- Android 项目实践(四)——服务器搭建
- 边框border的特殊应用
- gevent wsgi 部署bottle配置实例
- iOS 9 学习系列:Apple Pay
- TabHost子Activity响应onActivityResult事件
- lucene token解析
- Word Search II 解答
- 错误:No resource found that matches the given name 'Theme.AppCompat.Light'解决方法
- Tomcat处理HTTP请求:Connector源码
- Tomcat中的Connector配备
- Tomcat 的三种(bio,nio.apr) 高级 Connector 运行模式
- git理解和使用
- Apache负载均衡+Tomcat集群
- Tomcat connector元素常用配置(最大连接数等)
- Spring MVC国际化
- packageinstaller之权限获取及展现
- 事务
- App应用之发布各广告平台版本
- 使用Java实现DNS域名解析的简单示例
- Arch Linux 环境下使用 Tomcat 6 搭建多站点、带SSL证书、高性能NIO/APR网站的配置详解