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 }
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 }
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 }
end