UVA - 1635

这是一道组合数学加质因子分解的题目

题意 给n个数两两相邻的数互相相加,最后剩下一个数,然后看每个数的大小是否能%m

利用c(n,m)=(n-m+1)/m*c(n,m-1);

由于一直乘下去会long long ,所以只需(n-m+1)/m进行质数分解

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<stdlib.h>
#include<iostream>
#include<algorithm>
#include<string>
#include<queue>
#include<math.h>
#include<map>
using namespace std;

#define MST(vis,x) memset(vis,x,sizeof(vis))
#define INF 0x3f3f3f3f
#define ll long long
#define ull unsigned long long
#define maxn  100005
#define mod  1000000007
ll prim[maxn];
ll judge[1000005];
ll shu[1000005];
ll all;
ll tempm[1000005];
ll ttempm[1000005];
ll tempall;
void go(int x,int d)
{
    for(int a=0; a<tempall; a++)
    {
        if(x==1)break;
        if(x%ttempm[a]==0)
        {
            if(x==1)break;
            while(x%ttempm[a]==0)
            {
                tempm[a]+=d;
                x/=ttempm[a];
            }
        }
    }
    return ;
}
bool check()
{
    for(int a=0;a<tempall;a++)
        if(tempm[a]>0)return false;
    return true;
}
int main()
{
    MST(judge,0);
    all=0;
    int maxx=sqrt(1e9+0.5);
    for(int a=2; a<=maxx; a++)
    {
        if(!judge[a])
        {
            judge[a]=1;

            shu[all++]=a;
        }
        for(int b=0; b<all&&shu[b]*a<=maxx; b++)
        {
            judge[shu[b]*a]=1;
            if(a%shu[b]==0)break;
        }
    }
    ll n,m;
    while(scanf("%lld%lld",&n,&m)!=EOF)
    {
        MST(tempm,0);
        tempall=0;
        for(int a=0; a<all; a++)
        {
            //      printf("index %d\n",shu[a]);
            if(m==1)break;
            if(m%shu[a]==0)
            {
                if(m==1)break;
                while(m%shu[a]==0)
                {
                    tempm[tempall]++;
                    m/=shu[a];
                }
                ttempm[tempall++]=shu[a];
            }
        }
        if(m>1)
        {
            tempm[tempall]=1;
            ttempm[tempall++]=m;
        }
        int tempn=n;
        n--;
        ll sum=0;
        for(ll a=1; a<=n; a++)
        {
            go(n-a+1,-1);
            go(a,1);
            if(check())
                prim[sum++]=a+1;
        }
        printf("%lld\n",sum);
        for(int a=0; a<sum; a++)
        {
            if(a==0)printf("%lld",prim[a]);
            else printf(" %lld",prim[a]);
        }
        printf("\n");
    }
    return 0;
}

时间: 2024-11-09 09:23:45

UVA - 1635的相关文章

uva 1635 - Irrelevant Elements

链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=850&problem=4510 题意:一组数字a1,a2,a3.......,不断的相邻数成一组求和形成新的一组,直到最后不可以在合并为止,问最后的答案对m取模与哪些初始的项的无关? 题解:显然无关就是要求某一项在最终的数列中的系数是m的倍数,并且显然最终系列的系数是二项分布

UVa 1635 无关的元素(唯一分解定理+二项式定理)

https://vjudge.net/problem/UVA-1635 题意: 给定n个数a1,a2,...an,依次求出相邻两数之和,将得到一个新数列.重复上述操作,最后结果将变成一个数.问这个数除以m的余数与哪些数无关?例如n=3,m=2时,第一次求和得到a1+a2,a2+a3,再求和得到a1+2a2+a3,它除以2的余数和a2无关. 思路: 如果有n个数,最后结果就是杨辉三角的第n-1行.这样算出每一项的系数是很容易的,但是n很大,系数到最后很大.所以直接C%m的话不行. 有个整除的条件:

UVa 1635 - Irrelevant Elements-[分解质因数]

Young cryptoanalyst Georgie is investigating different schemes of generating random integer numbers ranging from 0 to m − 1. He thinks that standard random number generators are not good enough, so he has invented his own scheme that is intended to b

UVa 1635 Irrelevant Elements (唯一分解定理 || 组合数学)

题目 题目大意 对于给定的\(n\)个数\(a_1\), \(a_2\), ···, \(a_n\), 依次求出相邻两数之和, 将得到一个新数列.重复上述操作, 最后结果将变成一个数.问这个数除以\(m\)的余数将与哪些数无关? 例如\(n = 3\), \(m = 2\)时, 第一次求和得到\(a_1 + a_2\), \(a_2 + a_3\), 再求和得到\(a_1 + 2a_2 + a_3\), 它除以\(2\)的余数和\(a_2\)无关.\(1 ≤ n ≤ 10^5\), \(2 ≤

各大算法专题-组合数学篇

Q1(uva 1635): 给出长度为n(范围在[1,100000])的序列(仅仅知道长度n,具体某个元素我们并不清楚),类似差分序列的形成方法,我们这里得到这样的一个序列: 参考代码如下: #include<cstdio> #include<vector> #include<cmath> #include<cstring> using namespace std; const int maxn1 = 1000+ 5; const int maxn2 = 1

UVA 562 Dividing coins --01背包的变形

01背包的变形. 先算出硬币面值的总和,然后此题变成求背包容量为V=sum/2时,能装的最多的硬币,然后将剩余的面值和它相减取一个绝对值就是最小的差值. 代码: #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; #define N 50007 int c[102],d

UVA 10341 Solve It

Problem F Solve It Input: standard input Output: standard output Time Limit: 1 second Memory Limit: 32 MB Solve the equation: p*e-x + q*sin(x) + r*cos(x) + s*tan(x) + t*x2 + u = 0 where 0 <= x <= 1. Input Input consists of multiple test cases and te

UVA 11014 - Make a Crystal(容斥原理)

UVA 11014 - Make a Crystal 题目链接 题意:给定一个NxNxN的正方体,求出最多能选几个整数点.使得随意两点PQ不会使PQO共线. 思路:利用容斥原理,设f(k)为点(x, y, z)三点都为k的倍数的点的个数(要扣掉一个原点O).那么全部点就是f(1),之后要去除掉共线的,就是扣掉f(2), f(3), f(5)..f(n).n为素数.由于这些素数中包括了合数的情况,而且这些点必定与f(1)除去这些点以外的点共线,所以扣掉.可是扣掉后会扣掉一些反复的.比方f(6)在f

[UVa] Palindromes(401)

UVA - 401 Palindromes Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status Description A regular palindrome is a string of numbers or letters that is the same forward as backward. For example, the string "ABCDED