atcoder ABC 169 部分題解
阿新 • • 發佈:2021-11-03
A
簽到
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a , b;
cin >> a >> b;
cout << a * b << endl;
return 0;
}
B
簽到,用long long
#include <bits/stdc++.h> using namespace std; long long a[100010]; int main() { int n; cin >> n; for( int i = 1; i <= n ; i ++ ) cin >> a[i]; int cnt = 0; for( int i = 1 ; i <= n ; i ++ ) cnt += a[i] == 0 ? 1 : 0 ; if( cnt ) cout << "0\n" , exit(0); long long p = 1; for( int i = 1 ; i <= n ; i ++ ) { if( a[i] <= 1000000000000000000 / p ) p *= a[i]; else cout <<"-1\n" , exit(0); } cout << p << endl; return 0; }
C
如果直接用double
會溢位,但是題目已經規定浮點數只有兩位,所以我們可以先將b乘100,做完乘法在除100
#include <bits/stdc++.h> using namespace std; #define ll long long int main() { ll a , b; string s; cin >> a >> s; b = ( s[0] - '0' ) * 100 + ( s[2] - '0' ) * 10 +( s[3] - '0' ); cout << ( long long )( a * b / 100LL ) << endl; return 0; }
D
給定N,問有多少z滿足條件
- \(z =p^e\),\(p\)是質數
- z可以整除N
- z不重複
每次還要做N/=z;
首先我們可以把n進行質因數分解,對於每一個p,都會有 \(p^1 , p^2 \cdots , p^i\)
找i最大值可以用二分答案即可
#include <bits/stdc++.h> #define ll long long #define f( x ) ( x * ( x +1 ) / 2 ) using namespace std; const int N = 1e6 + 5; ll n , cnt , ans; int power[N] , p[N]; bool v[N]; int main() { cin >> n; for( ll i = 2 ; i * i <= n ; i ++ ) { if( n % i ) continue; cnt ++; while( n % i == 0 ) n /= i , power[ cnt ]++; } if( n != 1 ) power[ ++ cnt ] = 1 ; for( ll i = 1 , l , r , mid , res; i <= cnt ; i ++ ) { l = 1 , r = power[i] , res = 0; while( l <= r ) { mid = ( l + r ) >> 1; if( f( mid ) <= power[i] ) res = mid , l = mid + 1; else r = mid - 1; } ans += res; } cout << ans << endl; return 0; }
E
找規律題,A的中位數到B的中位數之間的每一個數都能夠取到,如果是奇數公差為一,偶數的公差為0
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
int n , a[N] , b[N];
int main()
{
cin >> n;
for( int i = 1 ; i <= n ; i ++ ) cin >> a[i] >> b[i];
sort( a + 1 , a + 1 + n ) , sort( b + 1 , b + 1 + n );
if( n & 1 ) cout << b[ n / 2 + 1 ] - a[ n / 2 + 1 ] + 1 << endl;
else cout << b[ n /2 ] + b[ n / 2 + 1 ] - a[ n / 2 ] - a[ n/ 2 + 1 ] + 1 << endl;
return 0;
}