您的位置:首页 > 其它

vijosP1289 老板娘的促销方案

2015-10-13 19:21 369 查看
vijosP1289 老板娘的促销方案

链接:https://vijos.org/p/1289

【思路】

组合公式+高精度。

如果n-m<2则无解。

否则对于第一个询问:ans=C(n-m,2)+C(n-m,3)=C(n-m+1,3)。对于第二个询问:



由此可见,对于递推式的化简也是很重要的,可以有效简化求解。

不管有没有陷阱,反正我用高精度=_=。高精度一定要写熟练,如臂指使。

【代码】

#include<iostream>
using namespace std;
struct Bign{
int len;
long long N[101];
Bign() {
for(int i=0;i<101;i++) N[i]=0;
}
};
int n,m;

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;
}
while(a.N[a.len-1]==0) a.len--;
a.N[0]/=x;
}

int main() {
Bign C; C.len=1; C.N[0]=1;

cin>>n>>m;
if(n-m<2) cout<<"NO!\n";
else
{
int k=n-m+1;
for(int i=k-2;i<=k;i++) multi(C,i);
div(C,6);
for(int i=C.len-1;i>=0;i--) cout<<C.N[i];
cout<<"\n";
}
Bign C2; C2.len=1; C2.N[0]=1;
for(int i=n-2;i<=n+1;i++) multi(C2,i);
div(C2,24);

if(C2.N[0]==0) {
C2.N[1]--;
C2.N[0]+=10;
}
C2.N[0]-=1;
for(int i=1;i<C2.len;i++) if(C2.N[i]<0) {
C2.N[i]+=10;
C2.N[i+1]--;
}
for(int i=C2.len-1;i>=0;i--) cout<<C2.N[i];
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: