JZOJ 100027. 【NOIP2017提高A組模擬7.7】表示式
阿新 • • 發佈:2018-11-17
JZOJ 100027. 【NOIP2017提高A組模擬7.7】表示式
題目
Description
Input
一行兩個整數k,p。
Output
一行一個整數表示答案。
Sample Input
1 3
Sample Output
6
Data Constraint
對於20%的數:
。
對於另外20%的資料k=1。
對於70%的資料:
。
對於100%的資料:k,p<=
。
題解
方法一
(內容來源:https://jzoj.net)
方法二
當
,答案為
。
當
,答案為
。
當
,答案為
。
當
,答案為
。
當
,答案為
。
這樣好像看不出什麼,但可以發現兩點:
1、答案有迴圈,且每個迴圈節是迴文的,
時答案為0.
2、
時非
的答案為
的倍數。
那麼我們把每個迴圈節前一半的答案除以
找出來。
當
:
。
當
:
。
當
:
。
當
:
。
當
:
。
當
:
。
當
:
。
通過觀察發現,每一行的第一項為
。
後面的呢?
不難發現(其實很難),每一項為一個公差為
的等差數列的字首和,再對
取模。
舉例:
當
,等差數列
。
當
,字首和
。
當
,對
取模後
。
這樣就可以快速實現了,注意
要特判。
程式碼
方法二的程式碼。
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
int k,p;
scanf("%d%d",&k,&p);
if(p==2)
{
printf("%d",k%2);
return 0;
}
k%=p;
if(k==0)
{
printf("0");
return 0;
}
if(k>p/2) k=p-k;
long long s