Project Euler 004 Largest palindrome product

来源:互联网 发布:手机验钞机软件新版 编辑:程序博客网 时间:2024/05/29 19:32

题意:求由两个三位数乘起来构成的数中的最大的回文数。
分析:依旧考虑两种做法。
1. 直接暴力枚举两个数在判断,O(n2logn)
2. 枚举回文串的前一半,再判断是否能由两个三位数乘起来,O(Σd)d表示枚举出来的回文串的约数个数,可以先pollard-rho把所有质因子搞出来,再dfs出所有的约数。

#include <bits/stdc++.h>#define ll long long#define pii std::pair<int,int>#define mp std::make_pair#define fi first#define se second#define SZ(x) (int)(x).size()#define pb push_backtemplate<class T>inline void chkmax(T &x, const T &y) {if(x < y) x = y;}template<class T>inline void chkmin(T &x, const T &y) {if(x > y) x = y;}template<class T>inline void read(T &x) {    char c;int f = 1;x = 0;    while(((c=getchar()) < '0' || c > '9') && c != '-');    if(c == '-') f = -1;else x = c-'0';    while((c=getchar()) >= '0' && c <= '9') x = x*10+c-'0';    x *= f;}static int outn;static char out[(int)2e7];template<class T>inline void write(T x) {    if(x < 0) out[outn++] = '-', x = -x;    if(x) {        static int tmpn;        static char tmp[20];        tmpn = 0;        while(x) tmp[tmpn++] = x%10+'0', x /= 10;        while(tmpn) out[outn++] = tmp[--tmpn];    }    else out[outn++] = '0';}bool check(int x) {    char str[10] = {0};    int l = 0;    while(x) str[l++] = x % 10 + '0', x /= 10;    for(int i = 0; i < l - i - 1; ++i)        if(str[i] != str[l - i - 1])            return false;    return true;}int main() {    int ans = 0;    for(int i = 100; i < 1000; ++i)        for(int j = i; j < 1000; ++j)            if(check(i * j))                chkmax(ans, i * j);    printf("%d\n", ans);    return 0;}
0 0