Codeforces Round #209 (Div. 2)
A:
要么是两次要么4次,判断是否在边界;
1 #include<cstdio> 2 using namespace std; 3 4 int main() 5 { 6 int n,m,x; 7 bool flag=0; 8 scanf("%d%d",&n,&m); 9 for(int i=0; i<n; i++) 10 for(int j=0; j<m; j++) 11 { 12 scanf("%d",&x); 13 if(x==1&&(i==0||i==n-1||j==0||j==m-1)) 14 flag=1; 15 } 16 if(flag)puts("2"); 17 else puts("4"); 18 return 0; 19 }
B:
太简单了;
1 #include<cstdio> 2 using namespace std; 3 4 int main() 5 { 6 int n,k; 7 scanf("%d%d",&n,&k); 8 for(int i=1;i<=k;i++) 9 printf("%d %d ",i*2,i*2-1); 10 for(int i=k+1;i<=n;i++) 11 printf("%d %d ",i*2-1,i*2); 12 return 0; 13 }
C:
分子每个都是N-1项的,所以从他们的最小的那个开始;
如果有k的整数倍个,就把他们合成一个,然后找到最小的那个不能合成的;
1 #include<cstdio> 2 #include<map> 3 #include<iostream> 4 #define maxn 100005 5 #define ll long long 6 #define mod 1000000007 7 using namespace std; 8 ll d[maxn],sum; 9 ll num[maxn]; 10 map<ll,ll>mp; 11 map<ll,ll>::iterator it; 12 13 ll Pow(ll x,ll k) 14 { 15 if(k==0) 16 return 1; 17 if(k==1) 18 return x; 19 ll c=Pow(x,k>>1); 20 if(k&1) 21 return ((c*(x%mod))%mod)*c%mod; 22 else 23 return c*c%mod; 24 } 25 26 int main() 27 { 28 int n; 29 ll k,ans; 30 cin>>n>>k; 31 for(int i=0; i<n; i++) 32 { 33 cin>>num[i]; 34 sum+=num[i]; 35 } 36 for(int i=0; i<n; i++) 37 { 38 mp[sum-num[i]]++; 39 } 40 for(it=mp.begin(); it!=mp.end(); it++) 41 { 42 if(it->second) 43 { 44 if(it->second%k==0) 45 mp[it->first+1]+=it->second/k; 46 else 47 { 48 if(it->first<=sum) 49 ans=it->first; 50 else ans=sum; 51 break; 52 } 53 } 54 } 55 cout<<Pow(k,ans)<<endl; 56 return 0; 57 }