temp2
# 1
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 5 using namespace std; 6 7 long long s = 0; 8 // 点数最大不会超过 154 9 bool book[200]; 10 int se[14]; // select 11 12 // 有点像DFS全排列的思路 13 void DFS2(int n, int num) 14 { 15 if(num > 13) return; 16 if(n == 14 && num != 13) return; //少了这句返回值错误 17 if(n == 14 && num == 13){ 18 s++; 19 return; 20 } 21 // 必须从 0 开始, 表示可拿可不拿 22 for(int i=0;i<=4;i++) 23 DFS2(n+1, num+i); 24 } 25 // 3598180 26 // 结果出不来, 但是可以手算出来...怕不是这么简单 27 void DFS(int n, int score) 28 { 29 if(n == 14){ 30 if(!book[score]){ 31 s++; 32 book[score] = true; 33 // cout<<score<<'\n'; 34 } 35 return; 36 } 37 for(int i=1;i<=13;i++){ 38 if(!se[i]) continue; 39 se[i]--; 40 DFS(n+1, score+i); 41 se[i]++; 42 } 43 } 44 // 154-28+1 45 46 int main() 47 { 48 memset(book, false, sizeof(book)); 49 for(int i=1;i<=13;se[i++] = 4); 50 // C(52,13) = 635013559600 51 // DFS(1, 0); // 貌似思路不对, 是我打牌太差了 52 // DFS2(1, 0); 53 // cout<<s<<'\n'; 54 cout<<3598180<<'\n'; 55 return 0; 56 } 57
# 2
1 /* 2 - 其实就是一个不定方程 3 - 这里可以暴力法 4 - 事实上最正确的做法是扩展欧几里得算法 5 */ 6 #include<iostream> 7 #include<cstdio> 8 #include<cstring> 9 10 using namespace std; 11 12 int main() 13 { 14 /* 15 for(int i=1;i<100;i++){ 16 for(int j=1;j<100;j++){ 17 if(i<j && i*2.3 + j*1.9 == 82.3) 18 cout<<i<<'\n'; 19 // cout<<i<<":"<<j<<'\n'; 20 } 21 } 22 */ 23 cout<<11<<'\n'; 24 25 return 0; 26 } 27
# 3
1 #include<iostream> 2 #include<cstring> 3 #include<string> 4 #include<sstream> 5 #include<cstdlib> 6 #include<ctime> 7 #include<cstdio> 8 9 using namespace std; 10 11 int main() 12 { 13 // 找规律 14 cout<<(2*(1<<9)-1+2)<<'\n'; 15 16 return 0; 17 }
# 4
1 #include<iostream> 2 3 using namespace std; 4 5 int c = 0; 6 7 void fun(int i, int j, int k) 8 { 9 // 最后遇到花,还剩一抖酒 10 if(i == 0 && j == 1 && k == 1){ 11 c++; 12 return; 13 } 14 if(i>0) fun(i-1, j, k*2); 15 if(j>0) fun(i, j-1, k-1); 16 } 17 18 int main() 19 { 20 // fun(5,10,2); 21 // 14 22 cout<<14<<endl; 23 24 return 0; 25 }
# 5 说好的对称呢
1 #include<iostream> 2 #include<cstdio> 3 4 using namespace std; 5 6 bool sure(int i, int j, int k, int z) 7 { 8 // 注意题目要求 9 if(i == j || k == z) return false; 10 int lu = i*k; 11 int ld = j*z; 12 int ru = i*10+k; 13 int rd = j*10+z; 14 // 小心浮点数 15 return lu*rd == ld*ru; 16 } 17 18 int main() 19 { 20 21 /* 22 long long c = 0; 23 for(int i=1;i<=9;i++){ 24 for(int j=1;j<=9;j++){ 25 for(int k=1;k<=9;k++){ 26 for(int z=1;z<=9;z++){ 27 if(sure(i, j, k, z)){ 28 // printf("%d/%d * %d/%d = %d/%d\n", i, j, k, z, i*10+k, j*10+z); 29 c++; 30 } 31 } 32 } 33 } 34 } 35 */ 36 37 // cout<<2*c<<'\n'; 38 cout<<2*14<<'\n'; 39 return 0; 40 } 41
# 6
1 #include<iostream> 2 #include<cstdio> 3 4 using namespace std; 5 6 int n = 0; 7 8 // A1 = (1 - sin(1)) 9 void An(int n, int k) 10 { 11 if(n == 1){ 12 printf("sin(%d", k); 13 return; 14 } 15 printf("sin(%d%c", k, (k&1)?'-':'+'); 16 An(n-1, k+1); 17 printf(")"); 18 } 19 20 void Sn(int n, int k, int z) 21 { 22 if(k == n){ 23 return; 24 } 25 printf("("); 26 Sn(n, k+1, z+1); 27 { 28 An(n-k, 1); 29 printf(")"); 30 printf("+%d)", z+1); 31 } 32 33 } 34 35 int main() 36 { 37 while(cin>>n) 38 { 39 Sn(n, 1, 1); 40 An(n, 1); 41 printf(")+1\n"); 42 } 43 44 return 0; 45 } 46 47 // ((sin(1)+3)sin(1-sin(2))+2)sin(1-sin(2+sin(3)))+1 48 // ((sin(1)+3)sin(1-sin(2))+2)sin(1-sin(2+sin(3)))+1
# 7 类似最大子阵,dp法
# 8
1 /* 2 - 初见,内存也足够,桶排序的话时间也够 3 - 难点在于换行输入的处理,一般的输入会吃掉换行符 4 - 这不是算法的初衷...... 5 */ 6 #include<iostream> 7 #include<cstring> 8 #include<cstdio> 9 #include<string> 10 using namespace std; 11 12 const int MAX = 100001; 13 int t[MAX]; 14 int s = MAX, e = 0; 15 16 // 整数快速幂 17 int pow(int x, int n) 18 { 19 if(n == 0) return 1; 20 int s = 1; 21 while(n) 22 { 23 if(n&1) s *= x; 24 x *= x; 25 n >>= 1; 26 } 27 return s; 28 } 29 30 void join(string x) 31 { // 手动分词吧,反向迭代器可以避免考虑数的位数 32 string::reverse_iterator rite; 33 int i = 0, n = 0; 34 rite = x.rbegin(); 35 while(rite!=x.rend()) 36 { 37 if(*rite == ' '){ 38 if(i < s) s = i; 39 if(i > e) e = i; 40 rite++;t[i]++; 41 i = 0;n = 0; 42 continue; 43 } 44 i += (int(*rite)-'0') * pow(10, n);n++; 45 rite++; 46 } 47 return; 48 } 49 50 int main() 51 { 52 int n; 53 string temp; 54 while(cin>>n) 55 { getline(cin, temp); // 这是关键,接收输入n时多出的回车 56 memset(t, 0, sizeof(t)); 57 for(int i=0;i<n;i++){ 58 // 逼急了,直接上getline 59 // 尽管C++有它自己的分词工具,这里就涉及到我的知识盲区了 60 string x; 61 getline(cin, x, '\n'); 62 x = ' ' + x; // 注意补充空格 63 join(x); 64 } 65 int ans[2] = {0}; 66 for(int i=s;i<=e;i++){ 67 if(t[i] == 0) ans[0] = i; 68 if(t[i] == 2) ans[1] = i; 69 } 70 cout<<ans[0]<<" "<<ans[1]<<endl; 71 } 72 73 return 0; 74 }
# 9
1 /* 2 * N = A + B/C 3 * A 最长不超过7位数, 这样我们确定一个 A 4 * 然后我们可以知道 C 的最后一位为 a[8] 5 * 通过计算我们可以确定 B 的 最后一位 b_end = (N - A)*a[8]%10 6 * 如此,我们就知道了 C 为多少 7 * 最后,判断一下是否满足等式 8 */ 9 #include<iostream> 10 #include<algorithm> 11 12 using namespace std; 13 14 int c = 0,N = 0;; 15 int a[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; 16 17 // 这里复习一下整数快速幂,就不调用数学库了 18 // O(log2N) 19 int pow(int x, int n) 20 { 21 int s = 1; 22 while(n) 23 { 24 if(n&1) s *= x; 25 x *= x; 26 n >>= 1; 27 } 28 return s; 29 } 30 31 // A、B、C, b开始, e-1结束的一段数组 32 int PI(int b, int e) 33 { 34 int s = 0, k = e-b-1; 35 while(b!=e) 36 { 37 s += a[b]*pow(10, k);k--;b++; 38 } 39 return s; 40 } 41 42 // 获取 B 最后一位的 local 43 int getB_end(int x) 44 { 45 int loc = 0; 46 for(int i=0;i<9;i++) 47 if(a[i] == x) 48 return i; 49 } 50 51 void solve(int *a, int N) 52 { 53 int A, B, C;A = B = C = 0; 54 // cout<<N<<endl; 55 for(int i=1;i<=7;i++){ 56 A = PI(0, i); 57 int B_end = ((N - A)*a[8])%10; 58 int loc = getB_end(B_end); 59 if(loc < i || loc >= 8) 60 continue; 61 // Ai! 这里注意一下是 loc + 1 62 B = PI(i, loc+1); 63 C = PI(loc+1, 9); 64 // cout<<A<<":"<<B<<":"<<C<<endl; 65 // cout<<A<<":"<<B<<":"<<C<<endl; 66 if(A*C + B == N*C){ 67 // cout<<A<<":"<<B<<":"<<C<<endl; 68 c++; 69 } 70 } 71 } 72 73 int main() 74 { 75 while(cin>>N) 76 { 77 while(next_permutation(a, a+9)) 78 { // 时间复杂度可以看成 O(9!) 79 solve(a, N); 80 // break; 81 } 82 cout<<c<<endl;c = 0; 83 } 84 return 0; 85 }