VOJ - For the Honest Election (递归/筛法)

For the Honest Election

题目链接:L - For the Honest Election Gym - 100247L

题意

有n个人要投票选市长,P想当市长,所以他要找一些支持者给他投票,他可以把一群人分成若干人数相等的小组,对每个小组还可以执行类似的操作,投票规则是每个组分成的小组中有过半组投支持P这个组才支持P,问P通过适当的分组后让自己被选上市长需要的最少支持者

思路

第一种,利用递归的思想,将大的人数,不断划分成小的人数,因为这个很明显是需要利用乘法原理的,比如有十五个人,3 * 5和5 * 3结果是一样的,所以现在只需,不断将数据划分成各个质数即可。每个质数的对应数应该是n/2+1

第二种,则将第一种思想用筛法来进行实现,哎,这样需要考虑的情况过多,因为2非常特殊,每次在2的倍数,不是由2所对应的质数所组合而成,而是有4和8所组合而成,比较复杂,需特判。说明我对于2的特殊性,没有考虑周全。

代码

#include <bits/stdc++.h>
using namespace std;
#define rep(i,j,k) for(int i = (int)j;i <= (int)k;i ++)
#define per(i,j,k) for(int i = (int)j;i >= (int)k;i --)
#define debug(x) cerr<<#x<<" = "<<(x)<<endl
#define mmm(a,b) memset(a,b,sizeof(a))
#define pb push_back

typedef double db;
typedef long long ll;
const int MAXN = (int)1e6+7;
const int INF = (int)0x3f3f3f3f;

map<ll,ll> dp;
ll solve(ll N){
    if (dp[N]!=0) return dp[N];
    ll ans = N/2+1;
    for (ll i = 2;i*i <= N;i ++){
        if (N%i == 0) {
            ans = min(ans,solve(N/i)*solve(i));
        }
    }
    return dp[N] = ans;
}

int main()
{
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);

    int N;
    dp[1] = 1;
    cin >> N;
    cout << solve(N) << endl;
}
#include <bits/stdc++.h>
using namespace std;
#define rep(i,j,k) for(ll i = (ll)j;i <= (ll)k;i ++)
#define per(i,j,k) for(ll i = (ll)j;i >= (ll)k;i --)
#define debug(x) cerr<<#x<<" = "<<(x)<<endl
#define mmm(a,b) memset(a,b,sizeof(a))
#define pb push_back

typedef double db;
typedef long long ll;
const ll MAXN = (ll)3e6+7;
const ll INF = (ll)0x3f3f3f3f;

ll isNoPrim[MAXN];

ll N;

int main()
{
    scanf("%lld",&N);

    isNoPrim[1] = 1;
    ll sr = (ll)sqrt(N);
    rep(i,2,sr+1){
        if (isNoPrim[i] != 1){
            isNoPrim[i] = (i+1)/2;
            if (i == 2) isNoPrim[i] = 2;
            for (ll j = 2;j*i <= sr+1;j ++){
                isNoPrim[i*j] = 1;
            }
        }
    }

    ll tmp = 0;
    ll ans = 1;
    while (N % 2 == 0){
        tmp ++;
        N /= 2;
    }
    while (tmp >= 7 ) tmp -= 3,ans *= 5;
    if (tmp == 1) ans *= 2;
    if (tmp == 2) ans *= 3;
    if (tmp == 3) ans *= 5;
    if (tmp == 4) ans *= 3*3;
    if (tmp == 5) ans *= 3*5;
    if (tmp == 6) ans *= 5*5;

    rep(i,2,sr+1){
        if (isNoPrim[i] > 1){
            while(N%i==0) {
                ans *= (ll)isNoPrim[i];
                N /= i;
            }
        }
    }
    if (N > 1) ans *= (N+1)/2;
    printf("%lld\n",ans);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个更详细的 Java 软件离线授权实现代码示例: ```java import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.security.KeyFactory; import java.security.NoSuchAlgorithmException; import java.security.PublicKey; import java.security.Signature; import java.security.spec.InvalidKeySpecException; import java.security.spec.X509EncodedKeySpec; import java.util.Base64; import java.util.Date; public class LicenseManager { private static final String LICENSE_FILE = "license.json"; private static final long EXPIRATION_TIME = 30 * 24 * 60 * 60 * 1000; // 30 days private String licenseKey; private Date expirationDate; public boolean validateLicense() { try { BufferedReader reader = new BufferedReader(new FileReader(LICENSE_FILE)); String json = reader.readLine(); reader.close(); // Parse license information from JSON JSONObject obj = new JSONObject(json); licenseKey = obj.getString("license_key"); long expirationTime = obj.getLong("expiration_date"); expirationDate = new Date(expirationTime); // Check if the license has expired if (expirationDate.before(new Date())) { return false; } // Validate the license signature String signature = obj.getString("signature"); if (!validateSignature(json, signature)) { return false; } // Check if the license key is valid (e.g. check with a license server) return validateLicenseKey(licenseKey); } catch (IOException | JSONException e) { return false; } } private boolean validateSignature(String data, String signature) { try { // Load the public key from a file or a resource byte[] publicKeyBytes = loadPublicKey(); X509EncodedKeySpec spec = new X509EncodedKeySpec(publicKeyBytes); KeyFactory factory = KeyFactory.getInstance("RSA"); PublicKey publicKey = factory.generatePublic(spec); // Verify the signature Signature sig = Signature.getInstance("SHA256withRSA"); sig.initVerify(publicKey); sig.update(data.getBytes()); return sig.verify(Base64.getDecoder().decode(signature)); } catch (IOException | NoSuchAlgorithmException | InvalidKeySpecException | java.security.SignatureException | java.security.InvalidKeyException e) { return false; } } private byte[] loadPublicKey() throws IOException { // TODO: Load the public key from a file or a resource // In this example, we load the public key from a Base64-encoded string String publicKeyString = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmJ3MvW6Y5Kfj2YKZv1zt\n" + "ZxOwXe0mN9Y6Quv2Gt2mxaRJnZ5y+9WnMhj8Z+SCMjEivKtLWtQwGJQVW2VWd0Kz\n" + "pB+QpZw2dOsTnixyI1i2RbCwQYw6q2rYXzXjvA6XJ2a6i7L9a1wF7QyIeqAtdH0u\n" + "3JQwz5uG/3e6LH6O5j8jHJj5vJyVvDkXQ1lBfUWn6+XKJdmpNqTcKx9YXJpN8mGz\n" + "V1ZJ6h0UW+auZ7m8Ld0gJy0l1lQaKwvW7C1tc0GcJpPQm6E5XJcUw1Yr3LQs7Gif\n" + "s1O8Rj0vOJ8jR8Mz7dWJ8d9tV9pQ5OuEzJZ2XnL1hE8W7sH8CjFZcZ1ZD6LjXEYJ\n" + "eQIDAQAB"; return Base64.getDecoder().decode(publicKeyString); } private boolean validateLicenseKey(String licenseKey) { // TODO: Implement license key validation logic return true; } } ``` 在上述代码中,`LICENSE_FILE` 常量指定授权文件的路径,`EXPIRATION_TIME` 常量指定授权的有效期限(单位为毫秒)。 `validateLicense()` 方用于验证授权文件的有效性,首先读取授权文件中的授权信息(这里使用 JSON 格式),判断授权是否已过期,然后再根据授权信息验证授权的有效性。 `validateSignature()` 方用于验证授权文件的数字签名,该方需要使用 RSA 算进行数字签名验证,具体步骤包括加载公钥、验证签名等。 `loadPublicKey()` 方用于加载公钥,可以从文件或者资源中加载公钥,或者直接使用 Base64 编码的公钥字符串。 `validateLicenseKey()` 方是一个示例方,用于与授权服务器验证授权密钥的有效性,可以根据实际情况进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值