閱讀375 返回首頁    go 阿裏雲 go 技術社區[雲棲]


【(a+b)%d=(a%d+b%d)%d】poj 2551 Ones

網上有一個很好的方法,大概的思想就是

11...11(n個1)的餘數=11..1(n-1個1)的餘數*10+1。。。

發現聰明人還是多的,他們的詳細思路是:

隻用餘數乘以10+1就可以了。。。
    如:3 滿足題意能除以它的最小數111 , 答案是3
   分析:1%3*10+1=11  j = 1
        11%3*10+1=21  j =2
        21%3=0     j=3 
   相當於:1%3 
          11%3
          111%3


其實就是驗證 (n%t*10+1)%t 的結果和 (n*10+1)%t 的結果是否一致,n不一定是111..1,經驗證,真的是一樣的,代碼附後,在簡化就是 (n%t*10)%t 和 (n*10)%t 的結果一樣。。

經驗證,這裏的10可以為任何正整數。。。其實把n拆成兩個數就可以理解了 x+y,x可以被t整除,y是餘數

原理就是(a+b)%d=(a%d+b%d)%d


#include"stdio.h"

int main()
{
	int n;
	int i;
	int tmp;
	while(~scanf("%d",&n))
	{
		tmp=1;
		for(i=1; ;i++)
		{
			if(tmp%n==0)
				break;

			tmp=tmp%n*10+1;
		}

		printf("%d\n",i);
	}

	return 0;
}

驗證代碼:

#include"stdio.h"

int main()
{
	int n;
	int t;
	while(~scanf("%d%d",&n,&t))
	{
		printf("%d\n",(n%t*10+1)%t);
		printf("%d\n",(n*10+1)%t);
	}

	return 0;
}




最後更新:2017-04-03 05:40:02

  上一篇:go CSS垂直/水平居中總結
  下一篇:go poj 2538 WERTYU