matrix_2015_1 138 - ZOJ Monthly, January 2015

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3844

 

第一个,n个数,每次操作最大数和最小数都变成他们的差值,最后n个数相同时输出此时的值,暴力跑。

 

 1 #include<cstdio>
 2 int main(){
 3     int t,n,a[16];
 4     while(~scanf("%d",&t)){
 5         while(t--){
 6             scanf("%d",&n);
 7             for(int i=0;i<n;i++){
 8                 scanf("%d",&a[i]);
 9             }
10             while(true){
11                 int bid=0,sid=0;
12                 for(int i=1;i<n;i++){
13                     if(a[bid]<a[i]) bid=i;
14                     if(a[sid]>a[i]) sid=i;
15                 }
16                 if(a[bid]==a[sid]){
17                     printf("%d\n",a[sid]);
18                     break;
19                 }
20                 a[bid]=a[sid]=a[bid]-a[sid];
21             }
22         }
23     }
24     return 0;
25 }
View Code

 

 

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5440

第二个,n个数,每次操作可以任意选两个数把他们变成他们gcd的值。最后问几步能都变成1,且输出每步选的数的下标。方法:先求出n个数的gcd,如果不为1,输出-1.否则一定能变成全1.变的方法是,先用第一个依次和后面的操作,直至第一个数变成1,然后再用第一个数把剩下的非1的都变掉。

 

 1 #include<cstdio>
 2 #include<vector>
 3 using namespace std;
 4 const int M=1e5+10;
 5 typedef pair<int,int> pii;
 6 int a[M];
 7 int gcd(int a,int b){
 8     return b?gcd(b,a%b):a;
 9 }
10 vector<pii> ans;
11 int main(){
12     int n;
13     int cas=1;
14     while(~scanf("%d",&n)){
15         for(int i=1;i<=n;i++){
16             scanf("%d",&a[i]);
17         }
18         int now=a[1];
19         for(int i=2;i<=n;i++){
20             now=gcd(now,a[i]);
21         }
22         printf("Case %d: ",cas++);
23         if(now>1){
24             puts("-1");
25             puts("");
26             continue;
27         }
28         ans.clear();
29         for(int i=2;i<=n;i++){
30             int now=gcd(a[1],a[i]);
31             a[1]=a[i]=now;
32             ans.push_back(make_pair(1,i));
33             if(now==1) break;
34         }
35         for(int i=2;i<=n;i++){
36             if(a[i]==1) continue;
37             ans.push_back(make_pair(1,i));
38         }
39         int len=ans.size();
40         printf("%d\n",len);
41         for(int i=0;i<len;i++){
42             printf("%d %d\n",ans[i].first,ans[i].second);
43         }
44         puts("");
45     }
46     return 0;
47 }
View Code

 

 

 

 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5435

第三个,52张牌,没有大小王的,输入几张,那么剩下的就是我们可以使用的,必须全用上,问有几种排列使得字典序小于他输入的。

 

 

 1 #include<cstdio>
 2 #include<cstring>
 3 #define mt(a,b) memset(a,b,sizeof(a))
 4 const int M=64;
 5 typedef long long LL;
 6 const LL mod=1e9+7;
 7 char a[M];
 8 int num[M];
 9 int sheng[M];
10 int getval(char c){
11     if(c=='A') return 1;
12     if(c=='J') return 11;
13     if(c=='Q') return 12;
14     if(c=='K') return 13;
15     return c-'0';
16 }
17 int s[M];
18 LL jc[M];
19 LL INV[M];
20 void inv_init() { //初始化%mod的乘法逆元
21     INV[1]=1;
22     for(int i=2; i<M; i++) {
23         INV[i]=INV[mod%i]*(mod-mod/i)%mod;
24     }
25 }
26 int main(){
27     inv_init();
28     jc[0]=1;
29     for(int i=1;i<M;i++){
30         jc[i]=jc[i-1]*i%mod;
31     }
32     while(~scanf("%s",a)){
33         int la=strlen(a);
34         mt(num,0);
35         int val;
36         int ls=0;
37         for(int i=0;i<la;i++){
38             if(a[i]=='1'){
39                 val=10;
40                 i++;
41             }
42             else{
43                 val=getval(a[i]);
44             }
45             num[val]++;
46             s[ls++]=val;
47         }
48         for(int i=1;i<=13;i++){
49             sheng[i]=4-num[i];
50         }
51         LL ans=0;
52         for(int i=0;i<ls;i++){
53             for(int j=1;j<s[i];j++){
54                 if(sheng[j]==0) continue;
55                 LL tmp=jc[52-ls-i-1];
56                 for(int k=1;k<=13;k++){
57                     if(sheng[k]==0) continue;
58                     if(k==j){
59                         for(int u=1;u<=sheng[k]-1;u++){
60                             tmp*=INV[u];
61                             tmp%=mod;
62                         }
63                     }
64                     else{
65                         for(int u=1;u<=sheng[k];u++){
66                             tmp*=INV[u];
67                             tmp%=mod;
68                         }
69                     }
70                 }
71                 ans+=tmp;
72                 ans%=mod;
73             }
74             if(sheng[s[i]]){
75                 sheng[s[i]]--;
76                 int sum=0;
77                 for(int j=1;j<=13;j++){
78                     sum+=sheng[j];
79                 }
80                 if(sum==0){
81                     if(i<ls-1) ans++;
82                     break;
83                 }
84                 continue;
85             }
86             break;
87         }
88         printf("%lld\n",ans%mod);
89     }
90     return 0;
91 }
View Code

 

 

end

posted on 2015-01-11 22:52  gaolzzxin  阅读(204)  评论(0编辑  收藏  举报