日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

训练指南第二章-基础问题

發布時間:2025/4/16 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 训练指南第二章-基础问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

訓練指南第二章-基礎問題 P170

?

?

?

?

?

?

?

?

?

?

?

?

?

?

UVA 11388 GCD LCM

顯然在合理的情況下,a=G,b=L

#include <bits/stdc++.h>int main() {int T;scanf ("%d", &T);while (T--) {int g, l;scanf ("%d%d", &g, &l);long long f = 1ll * g * l;if (l < g || l % g != 0) {puts ("-1");} else {printf ("%d %d\n", g, l);}}return 0; }

UVA 11889 Benefit

解法一:分解質因數,因為,,,所以在ai小于最大值時bi為最大值,否則為0.

解法二:數學方法,tb=C/A,當g=GCD(A, tb) != 1,a /= g. tb *=?.(不是很懂)

#include <bits/stdc++.h>void get_prime(int n, std::map<int, int> &mp) {int m = (int) sqrt (n + 0.5);for (int i=2; i<=m; ++i) {if (n % i == 0) {int cnt = 0;while (n % i == 0) {n /= i;mp[i]++;}}}if (n != 1) {mp[n]++;} }int _pow(int x, int n) {int ret = 1;while (n) {if (n & 1) {ret = ret * x;}n >>= 1;x = x * x;}return ret; }int solve(int a, int c) {std::map<int, int> mpa, mpc;get_prime (a, mpa);get_prime (c, mpc);int na = mpa.size (), nc = mpc.size ();if (na > nc || c % a != 0) {return -1;} else {int ret = 1;int m = (int) sqrt (c + 0.5);std::map<int, int>::iterator it;for (it=mpc.begin (); it!=mpc.end (); ++it) {if (!mpa.count (it->first) || mpa[it->first] < it->second) {ret *= _pow (it->first, it->second);}}return ret;} }int main() {int T;scanf ("%d", &T);while (T--) {int a, c;scanf ("%d%d", &a, &c);int ans = solve (a, c);if (ans != -1) {printf ("%d\n", ans);} else {puts ("NO SOLUTION");}}return 0; } #include <bits/stdc++.h>int GCD(int a, int b) {return b ? GCD (b, a % b) : a; }int solve(int a, int c) {if (a > c || c % a != 0) {return -1;}int tb = c / a;int g = GCD (a, tb);int mul = 1;while (g != 1) {mul *= g;a /= g;g = GCD (a, tb);}return tb * mul; }int main() {int T;scanf ("%d", &T);while (T--) {int a, c;scanf ("%d%d", &a, &c);int ans = solve (a, c);if (ans != -1) {printf ("%d\n", ans);} else {puts ("NO SOLUTION");}}return 0; }

UVA 10943 How do you add?

這個用隔板法,

#include <bits/stdc++.h>int binom[205][205]; const int MOD = 1000000;void init_binom() {for (int i=1; i<=200; ++i) {binom[i][0] = binom[i][i] = 1;for (int j=1; j<i; ++j) {binom[i][j] = binom[i-1][j-1] + binom[i-1][j];if (binom[i][j] >= MOD) {binom[i][j] -= MOD;}}} }int main() {init_binom ();int n, k;while (scanf ("%d%d", &n, &k) == 2) {if (!n && !k) {break;}printf ("%d\n", binom[n+k-1][k-1]);}return 0; }

UVA 10780 Again Prime? No Time.

分解質因數,取n!與m的某個質因數的個數商最小值。n!的某個質因數的個數=

#include <bits/stdc++.h>int main() {int T;scanf ("%d", &T);for (int cas=1; cas<=T; ++cas) {int m, n;scanf ("%d%d", &m, &n);int ans = 0x3f3f3f3f;int i = 2;while (m != 1) {int cnt = 0;while (m % i == 0) {cnt++;m /= i;}if (cnt) {int nn = n;int cnt2 = 0;while (nn) {cnt2 += nn / i;nn /= i;}ans = std::min (ans, cnt2 / cnt);}i++;}printf ("Case %d:\n", cas);if (ans) {printf ("%d\n", ans);} else {puts ("Impossible to divide");}}return 0; }

UVA 10892 LCM Cardinality

分解質因數,暴力枚舉~

#include <bits/stdc++.h>typedef long long ll;int GCD(int a, int b) {return b ? GCD (b, a % b) : a; }ll LCM(int a, int b) {return 1ll * a / GCD (a, b) * b; }int main() {int n;while (scanf ("%d", &n) == 1) {if (!n) {break;}std::vector<int> vec;int m = (int) sqrt (n + 0.5);for (int i=1; i<=m; ++i) {if (n % i == 0) {if (i != n / i) {vec.push_back (i);vec.push_back (n / i);} else {vec.push_back (i);}}}int ans = 1; //n nfor (int i=0; i<vec.size (); ++i) {for (int j=i+1; j<vec.size (); ++j) {if (LCM (vec[i], vec[j]) == n) {ans++;}}}printf ("%d %d\n", n, ans);}return 0; }

UVA 11752 The Super Powers

只要指數不是素數才可以符合條件,技巧:取對數來求最大的指數

#include <bits/stdc++.h>typedef unsigned long long ull; int nprime[105];bool is_prime(int n) {int m = (int) sqrt (n + 0.5);for (int i=2; i<=m; ++i) {if (n % i == 0) {return false;}}return true; }ull _pow(ull x, int n) {ull ret = 1;while (n) {if (n & 1) {ret = ret * x;}n >>= 1;x *= x;}return ret; }int main() {int tot = 0;for (int i=4; i<=64; ++i) {if (!is_prime (i)) {nprime[tot++] = i;}}std::map<ull, bool> mp;int bound = (1 << 16);for (int i=2; i<=bound; ++i) {double maxn = log (pow (2.0, 64.0)-1) / log (i);for (int j=0; j<tot; ++j) {int n = nprime[j];if (n >= maxn) {break;}mp[_pow ((ull) i, n)] = true;}}mp[1] = true;std::map<ull, bool>::iterator it;for (it=mp.begin (); it!=mp.end (); ++it) {printf ("%llu\n", it->first);}return 0; }

UVA 11076 Add Again

設有重復元素的全排列數為x,,所以,不考慮位置的話,總和為,然后考慮進位累加的問題。

#include <bits/stdc++.h>typedef unsigned long long ull;int main() {int a[13], cnt[15];ull f[13];f[0] = f[1] = 1;for (int i=2; i<=12; ++i) {f[i] = f[i-1] * i;}int n;while (scanf ("%d", &n) == 1) {if (!n) {break;}memset (cnt, 0, sizeof (cnt));int m = 0;for (int i=1; i<=n; ++i) {int x;scanf ("%d", &x);if (!cnt[x]) {a[m++] = x;}cnt[x]++;}ull sum = 0;for (int i=0; i<m; ++i) {ull div = f[cnt[a[i]]-1];for (int j=0; j<m; ++j) {if (i != j) {div *= f[cnt[a[j]]];}}sum += f[n-1] / div * a[i];}//printf ("$%llu\n", sum);ull ans = 0;for (int i=1; i<=n; ++i) {ans += sum;sum *= 10;}printf ("%llu\n", ans);/*ull tmp = 0;std::vector<ull> ans;for (int i=1; i<=n; ++i) {ans.push_back ((sum + tmp) % 10);tmp = (sum + tmp) / 10;}if (tmp) {printf ("%llu", tmp);}for (int i=ans.size ()-1; i>=0; --i) {printf ("%llu", ans[i]);}puts ("");*/}return 0; }

UVA 11609 Teams

#include <bits/stdc++.h>const int MOD = 1e9 + 7;int pow_mod(int x, int n) {int ret = 1;while (n) {if (n & 1) {ret = 1ll * ret * x % MOD;}n >>= 1;x = 1ll * x * x % MOD;}return ret; }int main() {int T;scanf ("%d", &T);for (int cas=1; cas<=T; ++cas) {int n;scanf ("%d", &n);printf ("Case #%d: %d\n", cas, 1ll * pow_mod (2, n - 1) * n % MOD);}return 0; }

POJ 2402 Palindrome Numbers(LA2889)

按照回文串長度分組,找到是第n/num[i]+1組的第n%num[i]-1個位置,因為每組都從1000...0001開始,很容易找到規律。

#include <bits/stdc++.h>typedef long long ll; ll num[32];ll tenp(int m) {ll ret = 1;while (m--) {ret *= 10;}return ret; }int main() {ll s = 9;num[1] = num[2] = s;for (int i=3; i<31; i+=2) {s *= 10;num[i] = num[i+1] = s;}int n;while (scanf ("%d", &n) == 1) {if (!n) {break;}int i;for (i=1; i<32 && n > num[i]; ++i) {n -= num[i];}int l = i / 2 + (i & 1);ll x = tenp (l - 1) + n - 1;printf ("%I64d", x);if (i & 1) {x /= 10;}while (x) {printf ("%d", x % 10);x /= 10;}puts ("");}return 0; }

UVA 11489 Integer Game

除了第一次特判外,接下來只能取3,6,9(保證剩余數字是3的倍數),判斷奇偶就可以了。

#include <bits/stdc++.h>const int N = 1e3 + 5; char str[N]; int cnt[10];bool judge() {memset (cnt, 0, sizeof (cnt));int sum = 0;for (int i=0; str[i]; ++i) {sum += str[i] - '0';cnt[str[i]-'0']++;}bool flag = false;int t = sum % 3;for (int i=t; i<10; i+=3) {if (cnt[i]) {cnt[i]--;flag = true;break;}}if (!flag) {return false;}int tot = cnt[3] + cnt[6] + cnt[9];return !(tot & 1); }int main() {int T;scanf ("%d", &T);for (int cas=1; cas<=T; ++cas) {scanf ("%s", str);printf ("Case %d: %c\n", cas, judge () ? 'S' : 'T');}return 0; }

UVA 10791 Minimum Sum LCM

這題題目說的是set集合,不僅僅只是兩個數字,結論是所有數字兩兩互質時最小,即分解質因數后,求

#include <bits/stdc++.h>long long solve(int n) {long long ret = 0;int cnt = 0;int m = (int) sqrt (n + 0.5);int nn = n;for (int i=2; i<=m; ++i) {if (n % i == 0) {cnt++;long long tmp = 1;while (n % i == 0) {n /= i;tmp *= i;}ret += tmp;}}if (!cnt || (cnt == 1 && n == 1)) {return 1ll + nn;} else {if (n != 1) {ret += n;}return ret;} }int main() {int n, cas = 0;while (scanf ("%d", &n) == 1) {if (!n) {break;}printf ("Case %d: %lld\n", ++cas, solve (n));}return 0; }

UVA 11461 Square Numbers

前綴思想

#include <bits/stdc++.h>const int N = 1e5 + 5; int sum[N];bool ok(int n) {int m = (int) sqrt (n);return m * m == n; }void init() {sum[0] = 0;for (int i=1; i<=100000; ++i) {sum[i] = sum[i-1];if (ok (i)) {sum[i]++;}} }int main() {init ();int a, b;while (scanf ("%d%d", &a, &b) == 2) {if (!a && !b) {break;}printf ("%d\n", sum[b] - sum[a-1]);}return 0; }

UVA 1319 Maximum

都乘以。,。因為p是偶數,貪心思想一些數取-1,一些取a,還有一個在范圍內。

#include <bits/stdc++.h>typedef long long ll;int main() {int m, p, a, b;while (scanf ("%d%d%d%d", &m, &p, &a, &b) == 4) {int sum = a * b;int x = 0, y = 0;for (int i=1; i<m; ++i) {if (sum >= a) {sum -= a;x++;} else {sum++;y++;}}double sa = sqrt (a * 1.0);double ans = y / pow (sa, p) + x * pow (sa, p);ans += pow (sum / sa, p);printf ("%d\n", (int) (ans + 0.5));}return 0; }

UVA 1315 Crazy tea party

找規律,靠近1的往1挪,靠近n的往n挪。

#include <bits/stdc++.h>int main() {int T;scanf ("%d", &T);while (T--) {int n;scanf ("%d", &n);int m = (n - 1) / 2;int ans = (1 + m) * m;if (n & 1) {ans -= m;}printf ("%d\n", ans);}return 0; }

?

?

轉載于:https://www.cnblogs.com/Running-Time/p/5527575.html

總結

以上是生活随笔為你收集整理的训练指南第二章-基础问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。