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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

Codeforces 900D Unusual Sequences:记忆化搜索

發布時間:2023/11/27 生活经验 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Codeforces 900D Unusual Sequences:记忆化搜索 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接:http://codeforces.com/problemset/problem/900/D

題意:

  給定x,y,問你有多少個數列a滿足gcd(a[i]) = x 且 ∑(a[i]) = y。

?

題解:

  由于gcd(a[i]) = x,所以y一定是x的倍數,否則無解。

  那么原題就等價于:問你有多少個數列a滿足gcd(a[i]) = 1 且 ∑(a[i]) = y/x。

?

  設f(k)為gcd(a[i]) = 1 且 ∑(a[i]) = k時的答案。

  只滿足條件∑(a[i]) = k的數列共有2^(k-1)種(隔板法)

  然后要從中去掉gcd不為1的數列。

  每個和為k且gcd不為1的數列a1,對應著一個和為k的因數且gcd為1的數列a2。

  因為a1可以由a2整體放大而來。

  那么也就是f(k) = 2^(k-1) - ∑ f(p),其中p為k的因數(p != k)。

  搜索 + map記憶化即可。

?

  由于需要用到的f(k),k均為y/x的因數,最多sqrt(y/x)個。

  加上map的log復雜度,所以總復雜度為O(sqrt(n)*log(n))。

?

AC Code:

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <string.h>
 4 #include <map>
 5 #define MOD 1000000007
 6 
 7 using namespace std;
 8 
 9 int x,y;
10 map<int,int> mp;
11 
12 long long quick_pow(long long n,long long k)
13 {
14     long long ans=1;
15     while(k>0)
16     {
17         if(k&1) ans=(ans*n)%MOD;
18         n=n*n%MOD;
19         k>>=1;
20     }
21     return ans;
22 }
23 
24 long long dfs(int i)
25 {
26     if(i==1) return 1;
27     if(mp.count(i)) return mp[i];
28     long long ans=quick_pow(2,i-1);
29     for(int j=2;j*j<=i;j++)
30     {
31         if(i%j==0)
32         {
33             ans=((ans-dfs(j))%MOD+MOD)%MOD;
34             if(i/j!=j) ans=((ans-dfs(i/j))%MOD+MOD)%MOD;
35         }
36     }
37     ans=((ans-1)%MOD+MOD)%MOD;
38     return mp[i]=ans;
39 }
40 
41 int main()
42 {
43     cin>>x>>y;
44     cout<<(y%x==0 ? dfs(y/x) : 0)<<endl;
45 }

?

轉載于:https://www.cnblogs.com/Leohh/p/8464069.html

總結

以上是生活随笔為你收集整理的Codeforces 900D Unusual Sequences:记忆化搜索的全部內容,希望文章能夠幫你解決所遇到的問題。

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