1001:
可以看作找规律,其实是组合数学的一道题目。符合要求的对应关系是要么是自己和自己对应,要么是互相对应,即1->2则2->1。
因为对于任何一个数如果他和自己本身对应,那么剩下还有n-1个数;如果他对应别的数(假定是a),那么a一定也和他对应,这样剩下还有n-2
个数,并且他可以对应的数的选择有n-1种,所以,可得递推关系 f[i]=((i-1)*f[i-2]+f[i-1]);
#include<iostream>
using namespace std;
long long f[1000002];
int main()
{
int T;
f[1]=1,f[2]=2;
for(int i=3;i<=1000000;i++)
f[i]=((i-1)*f[i-2]%1000000007+f[i-1]%1000000007)%1000000007;
long long n;
cin>>T;
int cas=1;
while(T--)
{
cin>>n;
cout<<"Case #"<<cas++<<":"<<endl;
cout<<f[n]<<endl;
}
return 0;
}
1003:
模拟题+字符串处理,用istringstream处理输入的字符串,取出数字进行&操作,最后将地址放入set,自动去重。
注意一点,最后不要偷懒 去掉数字之间的‘.’,因为会造成wa,假如数字分别是8.28和82.8会当作一样的,造成错误。
#include<iostream>
#include<set>
#include<string>
#include<sstream>
#include<stack>
#include<algorithm>
using namespace std;
set <string> st;
stack <int> stk;
int num;
int res[1005][5];
int tar[5];
int main()
{
int T,n,m;
string s,s1,sk;
cin>>T;
int cas=1;
while(T--)
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
int p=1;
cin>>sk;
for(int k=0;k<sk.length();k++)
if(sk[k]=='.')
sk[k]=' ';
istringstream inna(sk);
while(inna>>num)
{
res[i][p++]=num;
}
}
int op=1;
cout<<"Case #"<<cas++<<":"<<endl;
for(int i=1;i<=m;i++)
{
st.clear();
cin>>s1;
for(int k=0;k<s1.length();k++)
if(s1[k]=='.')
s1[k]=' ';
istringstream in(s1);
int tarn=1;
while(in>>num)
{
tar[tarn++]=num;
}
for(int i=1;i<=n;i++)
{
string nnn;
for(int j=1;j<=4;j++)
{
int now=tar[j]&res[i][j];
while(now)
{
stk.push(now%10);
now/=10;
}
while(!stk.empty())
{
nnn+=stk.top()+'0';
stk.pop();
}
nnn+='.';//坑比
}
st.insert(nnn);
}
cout<<st.size()<<endl;
}
}
return 0;
}
1004 简单的博弈,也算计算几何吧。 hint里面有提示,所以根据nim博弈的规则,只要先手能将盘子放入中央,那么一定获胜,因为要么后手放不下,要么先手总是可以和后手关于中心对称放置,取得胜利。画下图,简单的几何关系。
#include<iostream>
#include<cmath>
using namespace std;
#define pi 3.14159265358
int main()
{
int T;
cin>>T;
double n,a,r;
int cas=1;
while(T--)
{
cin>>n>>a>>r;
double cur=0.0;
cur=a/2/(tan(pi/n));
cout<<"Case #"<<cas++<<":"<<endl;
if(r<=cur)
cout<<"Give me a kiss!"<<endl;
else
cout<<"I want to kiss you!"<<endl;
}
return 0;
}