【POJ1177 Pairs of Integers】整数对(无输出方案)

当N为奇数时:

若$N $%$ 11 \not = 10$,有一组答案,否则没有。

当N为偶数时:

设我们删去了A的第k位(个位为第0位),A前面的部分记为a,删去了b,后面的部分记为c。

$k=0$时处理方法与奇数相同。

则有$A=a \times {10}^k \times 10 + b \times {10}^k +c$,

       $B=a \times {10}^k +c$。

所以$N=A+B=a \times {10}^k \times 11 + b \times {10}^k +2 \times c$,

       $N \div {10}^k=a \times 11+ b + \lfloor 2 \times c \div {10}^k \rfloor$,

       $a=N \div {10}^k \div 11,b=N \div {10}^k$ % $11,c=N $%${10}^k \div 2$

因为c可能进位或不进位,所以,对于每个$k(1\le k \le \lfloor \log_{10}^N \rfloor )$,

要多考虑进位的情况,即$b=b-1,c=(N$ %$ {10}^k +{10}^k) \div 2$。

因为A无前导0,所以要剔除$A=B=0$的情况。

还要满足:不进位$B \le 9$,进位$B \ge 0$。

最后把结果存起来,去重。

注意:要考虑所有情况和判断条件。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int n,ans[10002],tot,ntot;
int main()
{
    cin>>n;
    int fac=1,a,b,c,A,B,flag=n%2||n==10;
    if (flag)
    {
        if (n%11!=10||n==10)
            printf("1\n");
        else
            printf("0\n");
        return 0;
    }
    while(fac<=n)
    {
        b=n/fac%11;a=n/fac/11;
        c=(n-(a*11+b)*fac)/2;
        A=fac*(10*a+b)+c;
        B=fac*a+c;
        if ((a+b)&&b<=9&&A!=B&&A+B==n)
        {
            ans[++tot]=A;
        }
        b=n/fac%11-1;a=n/fac/11;
        c=(n-(a*11+b)*fac)/2;
        A=fac*(10*a+b)+c;
        B=fac*a+c;
        if ((a+b)&&b>=0&&A!=B&&A+B==n) ans[++tot]=A;
        fac*=10;
    }
    sort(ans+1,ans+1+tot);
    ntot=unique(ans+1,ans+1+tot)-(ans+1);
    printf("%d\n",ntot);
    return 0;
}

 

posted @ 2019-02-19 17:41  蒟蒻魔芋汤  阅读(193)  评论(0编辑  收藏  举报