intf(int b, int p, int m){ if(p == 0) return1; if(p == 1) return b % m; int t = f(b, p / 2, m), tt = (t * t) % m; if(p % 2 == 0) return tt; return (tt * b) % m; }
int b, p, m;
intmain(){ while(cin >> b >> p >> m){ cout << f(b % m, p, m) << endl; } return0; }
intmain(){ while(cin >> n){ double z = n * n * (1 - sqrt(3) / 4 - pi / 6); double y = n * n * (1 - pi / 4) - 2 * z; printf("%.3f %.3f %.3f\n", n * n - 4 * y - 4 * z, 4 * y, 4 * z); } return0; }
輸入為三個 32 bit 的 unsigned integersN, L, U,求出 M 滿足 L <= M <= U 且使得 N or M 為最大值,如果有多個 M 滿足該條件則傳回最小的。
解題方法
由 32 bit 的最高位開始檢查,如果 N 在此位置為 1 則 M 在此位可以為 0 or 1,為了避免 M < L 超出邊界,必須要檢查 如果 M 在此位以後都為 1 是否能滿足 M >= L。如果 N 在此位置為 0,則要盡可能的使 M 在此位置為 1,因此要檢查 當 M 在此位置為 1 時是否滿足 M <= U。
注意事項
(long long)1 << i 前面將 1 轉為 long long 是因為位移之後可能會超過 int 範圍。
程式碼
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
#include<bits/stdc++.h>
usingnamespace std;
longlong n, l, u;
intmain(){ while(cin >> n >> l >> u){ longlong m = 0; for(longlong i = 31; i >= 0; i--){ //由最高位往低位檢查 longlong t = ((longlong)1 << i), k = (m | t); if((n & t)){ // n 此位為 1 if(m + t - 1 < l) m = k; //是否大於下界 }elseif(k <= u) m = k; // 是否小於上界 } cout << m << endl; } return0; }