zoukankan      html  css  js  c++  java
  • CF822D 贪心+递推

    CF822D

    【题目链接】CF822D

    【题目类型】贪心+递推

    &题意:

    给你n个人,你可以把他们分组,但必须保持每组相等,分组之后每2个人会比赛,比如一组有i个人,那么就要比赛
    次,f[i]:表示当人数为i时,随意分组,比赛最少的次数.现在我们要求

    &题解:

    这是cf评测机,所以只要可以吧f(i)求出来,剩下的模拟就行了,又只是单组输入,注意一下的就是 t^1 t^2 t^3 ...可以直接借助上一个te 乘t就是下一个了,然而当时我还在傻傻的想用快速幂 = =
    f(i)怎么求呢? 我们可以先试着写出7,8个,就可以发现素数的时候不可以分,只能是1组,那么就一定是i * (i-1) / 2 不是素数的话就要想一想了,比如21, 它是由2个素数组成的,3 * 7 那分3组 还是分7组呢? 自己试下呗,你就会发现分7组是正确的,那么类比的推一下就发现每组个数越少越好,(这应该是有证明的,但我只会凭感觉..)所以只要找到最小的质因子就行了,之后也可以容易的得到dp方程 dp[i]=dp[t] * (i/t) + dp[i/t] 其中t是i的最小质因子 在要用最小质因子这块,我感觉算是贪心吧

    &代码:

    #include <cstdio>
    #include <bitset>
    #include <iostream>
    #include <set>
    #include <cmath>
    #include <cstring>
    #include <algorithm>
    #include <map>
    #include <queue>
    #include <vector>
    using namespace std;
    #define INF 0x3f3f3f3f
    #define ll long long
    #define fo(i,a,b) for(int i=(a);i<=(b);i++)
    #define fd(i,a,b) for(int i=(a);i>=(b);i--)
    #define cle(a,v) memset(a,(v),sizeof(a))
    const int maxn = 5e6 + 7, mod = 1e9 + 7;
    bool nopri[maxn];
    int l, r, f[maxn];
    ll t;
    vector<int> pri;
    void mkno() {
    	for(int i = 2; i < maxn; i++) {
    		if(!nopri[i]) {
    			pri.push_back(i);
    			for(int j = i + i; j < maxn; j += i) {
    				nopri[j] = true;
    			}
    		}
    	}
    }
    int main() {
    	freopen("E:1.in", "r", stdin);
    	scanf("%lld%d%d", &t, &l, &r);
    	mkno();
    	for(int i = 2; i < maxn - 6; i++) {
    		if(!nopri[i]) {
    			f[i] = ((ll)i * (i - 1) / 2) % mod;
    		}
    		else {
    			int j;
    			for(auto x : pri) {
    				if(i % x == 0) {
    					j = x;
    					break;
    				}
    			}
    			int te = i / j;
    			f[i] = ((ll)f[j] * te + f[te]) % mod;
    		}
    	}
    	ll ans = 0, tp = 1;
    	for(int i = l; i <= r; i++) {
    		ans = (ans + tp * f[i]) % mod;
    		tp = (tp * t) % mod;
    	}
    	printf("%lld
    ", ans);
    	return 0;
    }
    
  • 相关阅读:
    7-3.自定义列表
    GoLang 使用协程与管道随机生成姓名
    [Unity3D] 点击物品显示物品信息
    [Unity3D] 碰撞物体添加到背包
    [PS] DDS文件导入插件
    [Unity3D] 给角色添加武器
    [Unity3D] 刚体 碰撞器 触发器
    [Unity3D] 物体的几种移动方法
    [Unity3D] 解决导入的模型出现闪烁的问题
    [Unity3D] 人物角色跳跃(动画跳跃&刚体跳跃)
  • 原文地址:https://www.cnblogs.com/s1124yy/p/7143695.html
Copyright © 2011-2022 走看看