portal
這題目真是神題.
因為a
,b
互質,那就代表a,b的質因數分解的素數集合交集是空集.
那麼只要兩者的集合的質因數分解的素數集是空集合.
考慮每個數最多只有1個超過\(\sqrt\)的因子, 那麼這樣算\(\sqrt\)以內最多有8
個質數.
然後我們直接狀壓dp. 把大於等於22的大素因子單獨提出來, 按照這個進行處理.
設dp[i][j][k]
表示計算到第i
個數字, 甲的狀態為j
,乙的狀態為k
, 這裡空間太小開不下, 所以滾動第一維.
這裡有乙個小trick
,因為有部分數的最大素因子是相同的, 所以我們可以一起處理, 不用拷貝陣列, 這樣只要排一發序就可以了.
細節: 列舉狀態的時候必須從大到小列舉, 這裡和01揹包的原因相同.
#includeusing namespace std;
#define rep(i, a, b) for(ll i = (a), i##_end_ = (b); i <= i##_end_; ++i)
#define drep(i, a, b) for(ll i = (a), i##_end_ = (b); i >= i##_end_; --i)
#define clar(a, b) memset((a), (b), sizeof(a))
#define debug(...) fprllf(stderr, __va_args__)
typedef long long ll;
typedef long double ld;
ll read()
void write(ll x)
const ll maxn = 509, primes[9] = , maxmask = 301;
static ll n, mod;
void add(ll &x, ll y)
struct node
}s[maxn];
void separate(ll num)
s[index].bigger = num;
}void init()
static ll dp[maxmask][maxmask], f[2][maxmask][maxmask];
int cmp(node a, node b)
void solve()
drep (j, maxmask - 1, 0)
drep (k, maxmask - 1, 0)
if (i == n - 1 || s[i + 1].bigger != s[i].bigger || s[i].bigger == 1)
} }ll ans = 0;
rep (i, 0, maxmask - 1)
rep (j, 0, maxmask - 1)
if ((i & j) == 0) (ans += dp[i][j]) %= mod;
cout << ans << endl;
}int main()
NOI 2015 壽司晚宴
description 為了慶祝 noi 的成功開幕,主辦方為大家準備了一場壽司晚宴。小 g 和小 w 作為參加 noi 的選手,也被邀請參加了壽司晚宴。在晚宴上,主辦方為大家提供了 n 1 種不同的壽司,編號 1,2,3,n 1,其中第 i 種壽司的美味度為 i 1 即壽司的美味度為從 2 到 n...
NOI 2015 壽司晚宴
4197 noi2015 壽司晚宴 time limit 10 sec memory limit 512 mb submit 813 solved 508 submit status discuss description 為了慶祝 noi 的成功開幕,主辦方為大家準備了一場壽司晚宴。小 g 和小 ...
NOI2015 壽司晚宴
題目 這是一篇需要龜速乘的思博題解 我們考慮一下 n leq 30 的睿智暴力,顯然質因數個數少得一批,互質的條件又等價於沒有公共的質因子,所以我們直接狀壓質因子,dp i s 1 s 2 表示前 i 個數考慮完了,第乙個人選擇的質因子狀態為 s 1 第二個人選擇的質因子狀態為 s 2 轉移的話就考...