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; }
模拟题+字符串处理,用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; }
#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; }
原文地址:http://blog.csdn.net/nk_test/article/details/45999111