之江学院2017ACM校赛 C组合数 D递推式 E折半枚举 K思维
来源:互联网 发布:标签软件破解版 编辑:程序博客网 时间:2024/06/01 13:41
C:组合数,插板法,先每天都分k个题,还是n-m*k个题,然后就是将n-m*k分成m各部分(部分可以为零),
也就是,这样就可以写成阶乘的形式,就把问题转化成了求n!末尾有多少个零的问题。
#include<bits/stdc++.h>using namespace std;long long solve(long long x,int flog){ long long ans=0; while(x) { ans+=x/flog; x/=flog; } return ans;}int main(){ long long n,m,k; while(~scanf("%lld %lld %lld",&m,&n,&k)) { if(m==0||n-m*k<0) { printf("0\n"); } else { long long now1=solve(n-m*k+m-1,5)-solve(n-m*k,5)-solve(m-1,5);//因子里5的个数 long long now2=solve(n-m*k+m-1,2)-solve(n-m*k,2)-solve(m-1,2);//因子里2的个数 printf("%lld\n",min(now1,now2)); } } return 0;}
D:
递推式很容易求得,可以直接矩阵快速幂求。。。。。(数据有点问题,,n可以等于0,没特判蜜汁写法t了半天。。。。)
也可以找规律或待定系数法把通项公式求出来,然后直接一个快速幂,不过通项公式里有一个除2的操作,肯定直接取模是不可行的,求逆元又比较没必要,有一个比较好用的小定理(a/c)%b==((a%(b*c))/c)%b
#include<bits/stdc++.h>using namespace std;const long long mo=2e8;const long long mo1=1e8;long long poww(long long a,long long b){ long long sum=1; while(b) { if(b&1) sum*=a,sum%=mo; a*=a; if(a>mo) a%=mo; b>>=1; } return sum;}int main(){ long long x,y,n; while(~scanf("%lld %lld %lld",&x,&y,&n)) { long long ans=poww(3,n); ans=(ans+1)/2; // cout<<ans<<endl; printf("%lld\n",((ans%mo1)*((x+y)%mo1))%mo1); } return 0;}矩阵快速幂
#include<bits/stdc++.h>using namespace std;const long long mo=1e8;struct node{ long long a[2][2];};node mult(node a,node b){ node res; for(int i=0;i<2;i++) { for(int j=0;j<2;j++) {· for(int k=0;k<2;k++) { now+=a.a[i][k]*b.a[k][j]; now%=mo; } res.a[i][j]=now; } } return res;}long long poww(long long x){ node t,ans; t.a[0][0]=3; t.a[0][1]=-1; t.a[1][0]=0; t.a[1][1]=1; ans.a[0][0]=ans.a[1][1]=1;; ans.a[0][1]=ans.a[1][0]=0; while(x) { if(x&1) { ans=mult(ans,t); } t=mult(t,t); x>>=1; } return ((ans.a[0][0])%mo+mo+ans.a[0][1])%mo;}int main(){ long long x,y,n; while(~scanf("%lld %lld %lld",&x,&y,&n)) { printf("%lld\n",(((x+y)%mo)*poww(n))%mo); } return 0;}
E:给一堆数,分成尽可能相等的两堆,问两堆相差值最小多少
折半枚举,然后二分
meet in the middle 的思想,预处理n/2个物品能组合的所有情况,在把剩下的物品能组合的所有情况跑出来,枚举一边的值在二分另一边的值即可。
想加个去重操作,结果t了。。。。。
#include<bits/stdc++.h>using namespace std;int n;double a[100];vector<double>a1,a2,b,aa;double ans,sum;int cmp(double u,double v){ return u<v;}void dfs1(int step,double now){ if(step==n/2) { a1.push_back(now); return ; } dfs1(step+1,now); dfs1(step+1,now+a[step]); return ;}void dfs2(int step,double now){ if(step==n) { a2.push_back(now); return ; } dfs2(step+1,now); dfs2(step+1,now+a[step]); return ;}int main(){ int i; while(cin>>n) { a1.clear(); a2.clear(); sum=0; for(i=0;i<n;i++) scanf("%lf",&a[i]),sum+=a[i]; ans=1e12; dfs1(0,0.0); dfs2(n/2,0.0); sort(a2.begin(),a2.end(),cmp); vector<double>::iterator it; for(i=0;i<a1.size();i++) { it=lower_bound(a2.begin(),a2.end(),sum/2.0-a1[i]); if(it!=b.end()) { ans=min(ans,fabs(sum-2*(a1[i]+*it))); if(it!=b.begin()) ans=min(ans,fabs(sum-2*(a1[i]+*(it-1)))); } } printf("%.2lf\n",ans); } return 0;}
K,比较骚的一道题,当时想着求循环节。。。。都想太复杂了。。。直接模拟取余b然后乘10就可以了,可以用快速幂优化这个模拟过程
#include<bits/stdc++.h>using namespace std;long long a,b,n;long long poww(long long v){ long long sum=a%b,u=10; while(v) { if(v&1) { sum*=u; sum%=b; } u*=u; u%=b; v>>=1; } return sum;}int main(){ while(~scanf("%lld %lld %lld",&a,&b,&n)) { printf("%lld\n",(poww(n-1)*10)/b);//最后一步乘10然后除b就是结果 } return 0;}
阅读全文
0 0
- 之江学院2017ACM校赛 C组合数 D递推式 E折半枚举 K思维
- 2017年第0届浙江工业大学之江学院程序设计竞赛决赛 E: qwb和李主席 [折半枚举二分]【思维?套路!】
- 之江学院2017ACM 校赛 Problem K: qwb与小数(思维 快速幂)
- 2017年第0届浙江工业大学之江学院程序设计竞赛决赛 Problem E: qwb和李主席 (折半枚举!!!!n堆数分成最接近的两堆!!
- 2017年第0届浙江工业大学之江学院程序设计竞赛决赛 Problem E: qwb和李主席(折半搜索+类二分枚举)
- 之江学院2017ACM 校赛Problem D: qwb与神奇的序列
- 之江学院2017ACM 校赛Problem D: qwb与神奇的序列
- 51nod1268 和为K的组合 折半枚举
- 之江学院2017ACM 校赛Problem D: qwb与神奇的序列(找规律 快速幂)
- HDU5936折半枚举+思维
- 2017年第0届浙江工业大学之江学院程序设计竞赛决赛 K: qwb与小数 [快速幂]【思维】
- 之江学院 K: qwb与小数(思维求A/B第n位小数)
- 之江学院 K: qwb与小数(思维求A/B第n位小数)
- 51nod 1268 和为K的组合【Dp/Dfs/折半枚举】
- 之江学院2017ACM 校赛Problem G qwb去面试
- 之江学院2017ACM校赛 Problem B: qwb与矩阵(记忆化搜索)
- 之江学院2017ACM 校赛 Problem J: qwb又偷懒了(树状数组)
- 之江学院2017ACM 校赛Problem G: qwb去面试
- js操作属性的方法
- opencv函数源码之腐蚀
- Django(一)创建第一个Django的demo
- Red Hat Enterprise Linux6中配置centos6 yum下载站点
- ThreadPoolExecutor 与 ThreadLocal 配合使用中出现数据不一致问题
- 之江学院2017ACM校赛 C组合数 D递推式 E折半枚举 K思维
- POST和Get的区别
- 【hackerrank】World CodeSprint 11 T4
- iOS CoreAnimation(一)图层与视图,寄宿图
- 01Groovy简介
- 【详解】平面中最接近点对问题
- 如何处理训练样本不均衡的问题
- 【WEEX,MAC踩坑】Environment variable $ANDROID_HOME not found
- Eclipse安装Spring插件