UVA 1635 Irrelevant Elements

https://vjudge.net/problem/UVA-1635

 

题意:n个数,每相邻两个求和,最后变成1个数,问这个数除m的余数与第几个数无关

 

n个数使用次数分别为C(n-1,i) i∈[0,n-1]

对m分解质因数

同行内递推C(n-1,i),

累计答案的时候,只考虑C(n-1,i)分解质因数的结果  能否 将m的质因数 抵消

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include<cmath>
#include<cstring>
#include<cstdio>
#define N 100001
using namespace std;
int p[N],summ[N];
int ans[N];
int main()
{
    int n,m,t,a,b,cnt;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        p[0]=ans[0]=0;
        memset(summ,0,sizeof(summ));
        t=sqrt(m);
        for(int i=2;i<=t;i++)
         if(m%i==0)
         {
            p[++p[0]]=i;
            while(m%i==0)
            {
                m/=i;
                summ[p[0]]++;
            }
         }
        if(m>1) p[++p[0]]=m,summ[p[0]]=1;
        cnt=p[0];
        for(int i=1;i<n-1;i++)
        {
            a=n-i; b=i;
            for(int j=1;j<=p[0];j++)
            {
                if(a%p[j]==0)
                 {
                    while(a%p[j]==0)
                    {
                        a/=p[j];
                        summ[j]--;
                        if(!summ[j]) cnt--;
                    }
                 }
                if(b%p[j]==0)
                {
                    while(b%p[j]==0)
                    {
                        b/=p[j];
                        summ[j]++;
                        if(summ[j]==1) cnt++;
                    }
                }
            }
            if(!cnt) ans[++ans[0]]=i+1;
        }
        printf("%d\n",ans[0]);
        for(int i=1;i<ans[0];i++) printf("%d ",ans[i]);
        if(ans[0]) printf("%d",ans[ans[0]]);
        printf("\n");
    }
}

  

posted @   TRTTG  阅读(201)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示