IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> hdu 7111-Remove -> 正文阅读

[人工智能]hdu 7111-Remove

[hdu 7111] Brunhilda’s Birthday)

题意:

和P6756 [BalticOI2013] Brunhilda’s Birthday)一样的
给你p个质数集,您可以进行任意多次操作,每一次操作时,您选择一个素数 p i p_{i} pi?,这会使得n-> ? n p i ? ? p i \lfloor \frac{n}{p_{i}} \rfloor*p_{i} ?pi?n???pi?
现在给你一个n,让你计算1到n所有数的操作到0的操作次数,记a[i]:表示将i操作为0的最小操作次数
输出: ∑ 1 ≤ n ≤ N a n ? 2333 3 N ? n m o d ?? 2 64 \sum_{1\le n\le N}a_{n}*23333^{N-n}\mod 2^{64} 1nN?an??23333N?nmod264

Sample Input
1
6 2
2
3
 

Sample Output
17181031198765592570

Hint

In the sample case, ai is {1,1,2,3,3,0}. 

题解:

通过这个样例,再加上自己手写例子不难发现:

  1. 如果i大于所有质数的乘积,答案一定是0,也就是边界值是质数集的乘积,小于他有解,否则无解
  2. 如果有解,ai是非递减序列,而且是区间呈现的,每个值都覆盖一段区间

证明我不是很清楚。。。只是手推出的性质
详细证明可以看这个
既然是非严格单调递增,那我们就可以试着贪心去找答案
对于一个数x,我们想让其尽快减到0,肯定要选一个p满足x mod p最大,这样x-(x mod p)才会更小。那么我们反着想,什么样的数转移到x最优?区间[x+1,x-1+(x mod p)]转至x时最优,然后我们循环每个p,去找这个区间更远的右端点,这样可以让更多的点操作少
复杂度:
最后复杂度大概是一个O(|P|log n),|P|是是指质数集大小

代码:

// 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 LOCAL
    startTime = clock ();
    freopen ( "in.txt", "r", stdin );
#endif
}
void Time_test ()
{
#ifdef LOCAL
    endTime = 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();
}

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-09-08 10:43:36  更:2021-09-08 10:46:04 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 15:51:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码