[0418] 程序设计实训小结(更新1420)

  • 简易题解:
    • 1059 简单动规,注意用short储存map,int储存ans,否则TLE
    • 1083 使用getline(cin,str)读入一行字符串
    • 1099 注意对于不足4位的最大值/最小值的处理
    • 1110 数据有多组然而题目中并没有表明
    • 1116 可以使用STL库中reverse函数
    • 1119 使用strtol(num,*s,p)轻松转换进制。
      关联1145,1264
    • 1126 不能用STL函数偷懒
    • 1128关联1176
    • 1131 使用substr找出字串,reverse翻转,find查找
    • 1134,1244 数据太弱,unsigned long long 可破
    • 1139 关联1136,1140
    • 1148 数据其实有误,因为3200年不是闰年。
    • 1156 矩阵快速幂
    • 1195 ans=3*2^(n-1)-2;
    • 1282 先填左上角三角形,再填右下角三角形。
    • 1420
      • (106470=dbinom{15}{4}+dbinom{15}{5}*dbinom{5}{2}+dbinom{15}{6}*dbinom{6}{2}),这是我凑了1小时凑出来的结果,然后找不到一般规律。请教了数学大神得知这是传说中的Stirling Num,emmm,果然概统学不好的人连呼吸都是痛的吗??
      • (ans(n,m)=frac {1} {m!} cdot sum_{k=0}^m cdot (-1)^kcdot dbinom{m}{k}cdot (m-k)^n)
      • 注意使用高精度
      • Code:
#include<bits/stdc++.h>
using namespace std;
//Stirling Num
string mutiple(string a,string b) {
	int ans[a.size()+b.size()+10]= {0};
	for(int i=0; i<a.size(); ++i) {
		for(int j=0; j<b.size(); ++j) {
			ans[i+j+1]+=(a[i]-'0')*(b[j]-'0');
		}
	}
	for(int i=a.size()+b.size()-1; i>0; --i) {
		ans[i-1]+=ans[i]/10;
		ans[i]%=10;
	}
	int i=0;
	while(ans[i]==0)++i;
	string ans2;
	for(int j=i; j<a.size()+b.size(); ++j)ans2+=ans[j]+'0';
	return ans2;
}
string add(string num1,string num2) {
	vector<int>ans;
	int i=num1.size(),j=num2.size(),t=0;
	reverse(num1.begin(),num1.end());
	reverse(num2.begin(),num2.end());
	while(j<i) {
		num2+='0';
		j=num2.size();
	}
	while(i<j) {
		num1+='0';
		i=num1.size();
	}
	for(i=0; i<num1.size(); ++i)ans.push_back(num1[i]+num2[i]-'0'-'0');
	for(i=0; i<ans.size()-1; ++i) {
		if(ans[i]>=10) {
			ans[i+1]+=1;
			ans[i]-=10;
		}
	}
	if(ans[ans.size()-1]>=10) {
		ans[ans.size()-1]-=10;
		ans.push_back(1);
	}
	reverse(ans.begin(),ans.end());
	string ans2;
	for(int i=0;i<ans.size();++i)ans2+=ans[i]+'0';
	return ans2;
}
int main() {
	int n,m;
	string S[101000];
	string S2[101];
	S[0]="1";
	for(int i=1; i<=100; ++i) {
		S[i*100]="0";
		S[i*100+i]="1";
		for(int j=1; j<i; ++j){
			int tmp=j;
			string JJ;
			while(tmp)
			{
				JJ+=tmp%10+'0';
				tmp/=10;
			}
			reverse(JJ.begin(),JJ.end());
			S[i*100+j]=add(S[(i-1)*100+j-1],mutiple(S[(i-1)*100+j],JJ));
		}
	}
	while(cin>>n>>m) {
		if (n<m)cout<<0<<endl;
		else if(n==m)cout<<1<<endl;
		else cout<<S[n*100+m]<<endl;
	}
	return 0;
}
  • 代码Pack(将后缀名改为*.rar即可打开):
    • 制作图片压缩包:
      • 将image.jpg file.zip放到同一文件夹下
      • 新建文本文档,打开并输入"copy/b image.jpg+file.zip image2.jpg"
      • 新建文本文档.txt改名为1.bat
      • 双击运行1.bat
      • 演示GIF:
原文地址:https://www.cnblogs.com/shy-/p/8877704.html