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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

hdu 7111-Remove

發(fā)布時間:2023/12/3 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hdu 7111-Remove 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

[hdu 7111] Brunhilda’s Birthday)

題意:

和P6756 [BalticOI2013] Brunhilda’s Birthday)一樣的
給你p個質數(shù)集,您可以進行任意多次操作,每一次操作時,您選擇一個素數(shù)pip_{i}pi?,這會使得n->?npi??pi\lfloor \frac{n}{p_{i}} \rfloor*p_{i}?pi?n???pi?
現(xiàn)在給你一個n,讓你計算1到n所有數(shù)的操作到0的操作次數(shù),記a[i]:表示將i操作為0的最小操作次數(shù)
輸出:∑1≤n≤Nan?23333N?nmod264\sum_{1\le n\le N}a_{n}*23333^{N-n}\mod 2^{64}1nN?an??23333N?nmod264

Sample Input 1 6 2 2 3Sample Output 17181031198765592570HintIn the sample case, ai is {1,1,2,3,3,0}.

題解:

通過這個樣例,再加上自己手寫例子不難發(fā)現(xiàn):

  • 如果i大于所有質數(shù)的乘積,答案一定是0,也就是邊界值是質數(shù)集的乘積,小于他有解,否則無解
  • 如果有解,ai是非遞減序列,而且是區(qū)間呈現(xiàn)的,每個值都覆蓋一段區(qū)間
  • 證明我不是很清楚。。。只是手推出的性質
    詳細證明可以看這個
    既然是非嚴格單調遞增,那我們就可以試著貪心去找答案
    對于一個數(shù)x,我們想讓其盡快減到0,肯定要選一個p滿足x mod p最大,這樣x-(x mod p)才會更小。那么我們反著想,什么樣的數(shù)轉移到x最優(yōu)?區(qū)間[x+1,x-1+(x mod p)]轉至x時最優(yōu),然后我們循環(huán)每個p,去找這個區(qū)間更遠的右端點,這樣可以讓更多的點操作少
    復雜度:
    最后復雜度大概是一個O(|P|log n),|P|是是指質數(shù)集大小

    代碼:

    // Problem: Remove // Contest: HDOJ // URL: https://acm.hdu.edu.cn/showproblem.php?pid=7111 // Memory Limit: 262 MB // Time Limit: 6000 ms // By Jozky#include <bits/stdc++.h> #include <unordered_map> #define debug( a, b ) printf ( "%s = %d\n", a, b ); using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair<int, int> PII; clock_t startTime, endTime; // Fe~Jozky const ll INF_ll = 1e18; const int INF_int = 0x3f3f3f3f; void read (){}; template <typename _Tp, typename... _Tps> void read ( _Tp &x, _Tps &...Ar ) {x = 0;char c = getchar ();bool flag = 0;while ( c < '0' || c > '9' )flag |= ( c == '-' ), c = getchar ();while ( c >= '0' && c <= '9' )x = ( x << 3 ) + ( x << 1 ) + ( c ^ 48 ), c = getchar ();if ( flag )x = -x;read ( Ar... ); } template <typename T> inline void write ( T x ) {if ( x < 0 ){x = ~( x - 1 );putchar ( '-' );}if ( x > 9 )write ( x / 10 );putchar ( x % 10 + '0' ); } void rd_test () { #ifdef LOCALstartTime = clock ();freopen ( "in.txt", "r", stdin ); #endif } void Time_test () { #ifdef LOCALendTime = clock ();printf ( "\nRun Time:%lfs\n",(double)( endTime - startTime ) / CLOCKS_PER_SEC ); #endif } #define int ull const int maxn = 2e6 + 9; int prime[maxn]; ull ans[maxn]; ull poww ( ull a, ull b ) {ull ans = 1;while ( b ){if ( b & 1 )ans = ans * a;a = a * a;b >>= 1;}return ans; } signed main () {// rd_test();int t;read ( t );while ( t-- ){int n, p;read ( n, p );int maxx = 0;for ( int i = 1; i <= n; i++ )ans[i] = 0;for ( int i = 1; i <= p; i++ )prime[i] = 0;for ( int i = 1; i <= p; i++ ){read ( prime[i] );maxx = max ( maxx, prime[i] );}for ( int i = 1; i < min ( maxx, n ); i++ ){ans[i] = 1;}int r = 0;for ( int i = maxx - 1; i <= n; i = r ){r = 0;for ( int j = 1; j <= p; j++ ){r = max ( r, i / prime[j] * prime[j] + prime[j] - 1 );}// cout << "r=" << r << endl;for ( int j = i + 1; j <= r; j++ )ans[j] = ans[i] + 1;if ( i == r )break;}ull sum = 0;// for ( int i = 1; i <= n; i++ )// {// cout << "ans=" << ans[i] << endl;// }ull fac = 1;for ( int i = n; i >= 1; i-- ){sum += ans[i] * fac;fac = fac * 23333;}cout << sum << endl;}// Time_test(); }

    總結

    以上是生活随笔為你收集整理的hdu 7111-Remove的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。