Codeforces Round #146 (Div. 2)
靠手速拿了个还可以的rank。。。不会dp依旧硬伤
A.....
A
1 #include<iostream> 2 #include<cstring> 3 #include<string> 4 using namespace std; 5 int hash[100]; 6 int main(){ 7 string s; 8 while(cin>>s){ 9 int cnt=0; 10 memset(hash,0,sizeof(hash)); 11 for(int i=0;i<s.size();i++){ 12 if(!hash[s[i]-'a']) 13 hash[s[i]-'a']=1; 14 } 15 for(int i=0;i<26;i++) 16 if(hash[i])++cnt; 17 if((cnt&1)==0) 18 cout<<"CHAT WITH HER!"<<endl; 19 else 20 cout<<"IGNORE HIM!"<<endl; 21 } 22 return 0; 23 }
B.暴力+记忆化
B
1 #include<iostream> 2 #include<cstring> 3 #include<algorithm> 4 #include<vector> 5 #define N 1000010 6 using namespace std; 7 typedef long long ll; 8 const ll mod=(1<<30); 9 ll s[N]; 10 ll cal(ll n){ 11 if(s[n]!=-1)return s[n]; 12 s[n]=0; 13 for(ll i=1;i*i<=n;i++) 14 if(n%i==0){ 15 if(i*i==n)++s[n]; 16 else s[n]+=2; 17 } 18 return s[n]; 19 } 20 int main(){ 21 ll a,b,c; 22 // cout<<mod<<endl; 23 while(cin>>a>>b>>c){ 24 memset(s,-1,sizeof(s)); 25 ll ans=0; 26 for(ll i=1;i<=a;i++) 27 for(ll j=1;j<=b;j++) 28 for(ll k=1;k<=c;k++){ 29 // cout<<i*j*k<<endl; 30 ans+=cal(i*j*k); 31 // cout<<cal(i*j*k)<<endl;; 32 ans%=mod; 33 } 34 cout<<ans<<endl; 35 } 36 return 0; 37 }
C.分情况讨论。相邻两个数必然互质,相邻三个数构成mod3的完全剩余系。。。
如果n为奇数..n,n-1,n-2肯定两两互质。
如果n是偶数,那么就不能同时选n和n-2。。。这时候能选的最大的是n-3,但是如果n是3的倍数,n和n-3又mod3同余,这样只可以选n-1,n-2,n-3。。。
还要特判1和2
C
1 #include<iostream> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 int main(){ 6 long long n; 7 while(cin>>n){ 8 if(n==1||n==2){ 9 cout<<n<<endl; 10 continue; 11 } 12 long long ans; 13 if(n&1)ans=n*(n-1)*(n-2); 14 else if(n%3) 15 ans=n*(n-1)*(n-3); 16 else ans=(n-1)*(n-2)*(n-3); 17 cout<<ans<<endl; 18 } 19 return 0; 20 }
D.概率dp。。暂时不会。。待补充。
E.没看。。。