NYOJ-102-二乗型を求める


じゅんほうしきかながた
時間制限:
1000 ms|メモリ制限:
65535 KB
難易度:
3
説明
aのb次の方がcに対して余分な値を取ることを求めます
 
入力
1行目に入力される整数nは、テストデータのグループ数を表す(n<100)
各グループのテストは1行のみで、そのうち3つの正の整数a,b,c(1=しゅつりょく
aのb次方対cの剰余を出力した後の結果
サンプル入力
3
2 3 5
3 100 10
11 12345 12345

サンプル出力
3
1
10481

タイトルリンク:http://acm.nyist.net/JudgeOnline/problem.php?pid=102
参照先:
Long Long、__int 64使用概要
前言:16ビット環境ではint/unsigned intが16ビット、long/unsigned longが32ビット、intが32ビット、unsigned intが16ビット、long/unsigned longが32ビットを占めるときに使用する必要がある:longとintの範囲は[-2^31,2^31)、すなわち-2174483648~2174748647であり、unsignedの範囲は[0,2^32],すなわち0~4294967295であるため、従来の32ビット整数は40億程度しか処理できず、40億よりも多くの数に遭遇すると64ビットが使用される.64ビット使用範囲:64ビット整数に対するコンパイラの拡張が異なる.VCでは__int64/unsigned__int64が使用され、範囲は[-2^63,2^63)および[0,2^64],すなわち−922337203685475808~922337203685475807と0~18446744073709551615(約1800億円). 注意点:1、コンパイラによって64ビットの申明方式が異なる.2、long long/unsigned long longは一般的にLinuxの下で説明する方式で、例えば:G++3、_int64/unsigned __int 64は一般的にWindowsの下で64ビットを使用する申明方式であり、例えばVS 4は、付与時にllを加えて明示的に付与することに注意する必要がある.5、64ビットと32ビットの混合演算を行うと、32ビットの整数は暗黙的に64ビットの整数に変換される.6、printf("");long longは%lld出力を使用し、_int 64は%I 64 d、符号なしでdの代わりにuを使用すればよい.7、テストの下でコンパイラは普通2種類の操作をサポートして、あまり葛藤する必要はありません.華麗な区切り線===================================================================================h> #include intmain(){unsigned long longa=412432424000 ll;unsigned__int64 b=922337203685475808 ll;printf("%I 64 u",a);//%lld使用時に正常に出力できず、why?解答はprintf("%I 64 u",b);system("pause");return 0;}実験したばかりで、VC 6、DEV、CodeBlocksの中でC言語はすべて使うことができますint 64は、フォーマット出力識別子が%I 64 dである.ただし、VC 6では数字の後にLを2つ追加するとエラーが発生し、1つだけ追加するか、追加しないことができます.資料を調べたら、_int 64はwindows専用でvc、gccなどのコンパイラでサポートされていますが、UNIX、Linuxではlong longで%lldを合わせる必要があります.後者は標準Cの規定です!long long配合%I 64 dを試してみましたが、long longでも__でも正しく出力できます.int 64配合%lldは正しく出力できません.だから私はwindowsの下でlonglongあるいは,_を使う必要があると結論しました.int 64配合%64 d.一方,UNIX,Linuxでは標準Cで規定されたlong long配合%lldを用いなければならない.記.
元のアドレス:http://hi.baidu.com/xezchifbktckptr/item/d97b0edbda6678e5b3f777a9
回答:
#include int main() {      int n;      scanf("%d",&n);      while(n--)      {  int b,c;  long long a,s=1;           scanf("%lld%d%d",&a,&b,&c);          while(b>0)          {               if(b%2==1)         s=s*a%c;        a=a*a%c;        b/=2;          }           printf("%lld",s);      }        return 0; }